// Copyright 2015 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/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:vector_math/vector_math_64.dart'; import 'rendering_tester.dart'; void main() { test('RenderViewport basic test - no children', () { final RenderViewport root = new RenderViewport( crossAxisDirection: AxisDirection.right, offset: new ViewportOffset.zero(), ); expect(root, hasAGoodToStringDeep); expect( root.toStringDeep(minLevel: DiagnosticLevel.info), equalsIgnoringHashCodes( 'RenderViewport#00000 NEEDS-LAYOUT NEEDS-PAINT DETACHED\n' ' parentData: MISSING\n' ' constraints: MISSING\n' ' size: MISSING\n' ' axisDirection: down\n' ' crossAxisDirection: right\n' ' offset: _FixedViewportOffset#00000(offset: 0.0)\n' ' anchor: 0.0\n' ), ); layout(root); root.offset = new ViewportOffset.fixed(900.0); expect(root, hasAGoodToStringDeep); expect( root.toStringDeep(minLevel: DiagnosticLevel.info), equalsIgnoringHashCodes( 'RenderViewport#00000 NEEDS-LAYOUT NEEDS-PAINT\n' ' parentData: <none>\n' ' constraints: BoxConstraints(w=800.0, h=600.0)\n' ' size: Size(800.0, 600.0)\n' ' axisDirection: down\n' ' crossAxisDirection: right\n' ' offset: _FixedViewportOffset#00000(offset: 900.0)\n' ' anchor: 0.0\n', ), ); pumpFrame(); }); test('RenderViewport basic test - down', () { RenderBox a, b, c, d, e; final RenderViewport root = new RenderViewport( crossAxisDirection: AxisDirection.right, offset: new ViewportOffset.zero(), children: <RenderSliver>[ new RenderSliverToBoxAdapter(child: a = new RenderSizedBox(const Size(100.0, 400.0))), new RenderSliverToBoxAdapter(child: b = new RenderSizedBox(const Size(100.0, 400.0))), new RenderSliverToBoxAdapter(child: c = new RenderSizedBox(const Size(100.0, 400.0))), new RenderSliverToBoxAdapter(child: d = new RenderSizedBox(const Size(100.0, 400.0))), new RenderSliverToBoxAdapter(child: e = new RenderSizedBox(const Size(100.0, 400.0))), ], ); expect(root, hasAGoodToStringDeep); layout(root); expect(root.size.width, equals(800.0)); expect(root.size.height, equals(600.0)); expect(root, hasAGoodToStringDeep); expect( root.toStringDeep(minLevel: DiagnosticLevel.info), equalsIgnoringHashCodes( 'RenderViewport#00000 NEEDS-PAINT\n' ' │ parentData: <none>\n' ' │ constraints: BoxConstraints(w=800.0, h=600.0)\n' ' │ size: Size(800.0, 600.0)\n' ' │ axisDirection: down\n' ' │ crossAxisDirection: right\n' ' │ offset: _FixedViewportOffset#00000(offset: 0.0)\n' ' │ anchor: 0.0\n' ' │\n' ' ├─center child: RenderSliverToBoxAdapter#00000 relayoutBoundary=up1 NEEDS-PAINT\n' ' │ │ parentData: paintOffset=Offset(0.0, 0.0) (can use size)\n' ' │ │ constraints: SliverConstraints(AxisDirection.down,\n' ' │ │ GrowthDirection.forward, ScrollDirection.idle, scrollOffset:\n' ' │ │ 0.0, remainingPaintExtent: 600.0, crossAxisExtent: 800.0,\n' ' │ │ crossAxisDirection: AxisDirection.right,\n' ' │ │ viewportMainAxisExtent: 600.0, remainingCacheExtent: 850.0\n' ' │ │ cacheOrigin: 0.0 )\n' ' │ │ geometry: SliverGeometry(scrollExtent: 400.0, paintExtent: 400.0,\n' ' │ │ maxPaintExtent: 400.0, cacheExtent: 400.0)\n' ' │ │\n' ' │ └─child: RenderSizedBox#00000 NEEDS-PAINT\n' ' │ parentData: paintOffset=Offset(0.0, -0.0) (can use size)\n' ' │ constraints: BoxConstraints(w=800.0, 0.0<=h<=Infinity)\n' ' │ size: Size(800.0, 400.0)\n' ' │\n' ' ├─child 1: RenderSliverToBoxAdapter#00000 relayoutBoundary=up1 NEEDS-PAINT\n' ' │ │ parentData: paintOffset=Offset(0.0, 400.0) (can use size)\n' ' │ │ constraints: SliverConstraints(AxisDirection.down,\n' ' │ │ GrowthDirection.forward, ScrollDirection.idle, scrollOffset:\n' ' │ │ 0.0, remainingPaintExtent: 200.0, crossAxisExtent: 800.0,\n' ' │ │ crossAxisDirection: AxisDirection.right,\n' ' │ │ viewportMainAxisExtent: 600.0, remainingCacheExtent: 450.0\n' ' │ │ cacheOrigin: 0.0 )\n' ' │ │ geometry: SliverGeometry(scrollExtent: 400.0, paintExtent: 200.0,\n' ' │ │ maxPaintExtent: 400.0, hasVisualOverflow: true, cacheExtent:\n' ' │ │ 400.0)\n' ' │ │\n' ' │ └─child: RenderSizedBox#00000 NEEDS-PAINT\n' ' │ parentData: paintOffset=Offset(0.0, -0.0) (can use size)\n' ' │ constraints: BoxConstraints(w=800.0, 0.0<=h<=Infinity)\n' ' │ size: Size(800.0, 400.0)\n' ' │\n' ' ├─child 2: RenderSliverToBoxAdapter#00000 relayoutBoundary=up1 NEEDS-PAINT\n' ' │ │ parentData: paintOffset=Offset(0.0, 800.0) (can use size)\n' ' │ │ constraints: SliverConstraints(AxisDirection.down,\n' ' │ │ GrowthDirection.forward, ScrollDirection.idle, scrollOffset:\n' ' │ │ 0.0, remainingPaintExtent: 0.0, crossAxisExtent: 800.0,\n' ' │ │ crossAxisDirection: AxisDirection.right,\n' ' │ │ viewportMainAxisExtent: 600.0, remainingCacheExtent: 50.0\n' ' │ │ cacheOrigin: 0.0 )\n' ' │ │ geometry: SliverGeometry(scrollExtent: 400.0, hidden,\n' ' │ │ maxPaintExtent: 400.0, hasVisualOverflow: true, cacheExtent:\n' ' │ │ 50.0)\n' ' │ │\n' ' │ └─child: RenderSizedBox#00000 NEEDS-PAINT\n' ' │ parentData: paintOffset=Offset(0.0, -0.0) (can use size)\n' ' │ constraints: BoxConstraints(w=800.0, 0.0<=h<=Infinity)\n' ' │ size: Size(800.0, 400.0)\n' ' │\n' ' ├─child 3: RenderSliverToBoxAdapter#00000 relayoutBoundary=up1 NEEDS-PAINT\n' ' │ │ parentData: paintOffset=Offset(0.0, 1200.0) (can use size)\n' ' │ │ constraints: SliverConstraints(AxisDirection.down,\n' ' │ │ GrowthDirection.forward, ScrollDirection.idle, scrollOffset:\n' ' │ │ 0.0, remainingPaintExtent: 0.0, crossAxisExtent: 800.0,\n' ' │ │ crossAxisDirection: AxisDirection.right,\n' ' │ │ viewportMainAxisExtent: 600.0, remainingCacheExtent: 0.0\n' ' │ │ cacheOrigin: 0.0 )\n' ' │ │ geometry: SliverGeometry(scrollExtent: 400.0, hidden,\n' ' │ │ maxPaintExtent: 400.0, hasVisualOverflow: true)\n' ' │ │\n' ' │ └─child: RenderSizedBox#00000 NEEDS-PAINT\n' ' │ parentData: paintOffset=Offset(0.0, -0.0) (can use size)\n' ' │ constraints: BoxConstraints(w=800.0, 0.0<=h<=Infinity)\n' ' │ size: Size(800.0, 400.0)\n' ' │\n' ' └─child 4: RenderSliverToBoxAdapter#00000 relayoutBoundary=up1 NEEDS-PAINT\n' ' │ parentData: paintOffset=Offset(0.0, 1600.0) (can use size)\n' ' │ constraints: SliverConstraints(AxisDirection.down,\n' ' │ GrowthDirection.forward, ScrollDirection.idle, scrollOffset:\n' ' │ 0.0, remainingPaintExtent: 0.0, crossAxisExtent: 800.0,\n' ' │ crossAxisDirection: AxisDirection.right,\n' ' │ viewportMainAxisExtent: 600.0, remainingCacheExtent: 0.0\n' ' │ cacheOrigin: 0.0 )\n' ' │ geometry: SliverGeometry(scrollExtent: 400.0, hidden,\n' ' │ maxPaintExtent: 400.0, hasVisualOverflow: true)\n' ' │\n' ' └─child: RenderSizedBox#00000 NEEDS-PAINT\n' ' parentData: paintOffset=Offset(0.0, -0.0) (can use size)\n' ' constraints: BoxConstraints(w=800.0, 0.0<=h<=Infinity)\n' ' size: Size(800.0, 400.0)\n' ), ); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 0.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 400.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 800.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 1200.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 1600.0)); expect(a.localToGlobal(const Offset(800.0, 400.0)), const Offset(800.0, 400.0)); expect(b.localToGlobal(const Offset(800.0, 400.0)), const Offset(800.0, 800.0)); expect(c.localToGlobal(const Offset(800.0, 400.0)), const Offset(800.0, 1200.0)); expect(d.localToGlobal(const Offset(800.0, 400.0)), const Offset(800.0, 1600.0)); expect(e.localToGlobal(const Offset(800.0, 400.0)), const Offset(800.0, 2000.0)); root.offset = new ViewportOffset.fixed(200.0); pumpFrame(); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -200.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 200.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 600.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 1000.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 1400.0)); root.offset = new ViewportOffset.fixed(600.0); pumpFrame(); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -600.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -200.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 200.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 600.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 1000.0)); root.offset = new ViewportOffset.fixed(900.0); pumpFrame(); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -900.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -500.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -100.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 300.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 700.0)); final HitTestResult result = new HitTestResult(); root.hitTest(result, position: const Offset(130.0, 150.0)); expect(result.path.first.target, equals(c)); }); test('RenderViewport basic test - up', () { RenderBox a, b, c, d, e; final RenderViewport root = new RenderViewport( axisDirection: AxisDirection.up, crossAxisDirection: AxisDirection.right, offset: new ViewportOffset.zero(), children: <RenderSliver>[ new RenderSliverToBoxAdapter(child: a = new RenderSizedBox(const Size(100.0, 400.0))), new RenderSliverToBoxAdapter(child: b = new RenderSizedBox(const Size(100.0, 400.0))), new RenderSliverToBoxAdapter(child: c = new RenderSizedBox(const Size(100.0, 400.0))), new RenderSliverToBoxAdapter(child: d = new RenderSizedBox(const Size(100.0, 400.0))), new RenderSliverToBoxAdapter(child: e = new RenderSizedBox(const Size(100.0, 400.0))), ], ); layout(root); expect(root.size.width, equals(800.0)); expect(root.size.height, equals(600.0)); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 200.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -200.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -600.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -1000.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -1400.0)); root.offset = new ViewportOffset.fixed(200.0); pumpFrame(); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 400.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 0.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -400.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -800.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -1200.0)); root.offset = new ViewportOffset.fixed(600.0); pumpFrame(); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 800.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 400.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 0.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -400.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -800.0)); root.offset = new ViewportOffset.fixed(900.0); pumpFrame(); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 1100.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 700.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 300.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -100.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -500.0)); final HitTestResult result = new HitTestResult(); root.hitTest(result, position: const Offset(150.0, 350.0)); expect(result.path.first.target, equals(c)); }); Offset _getPaintOrigin(RenderObject render) { final Vector3 transformed3 = render.getTransformTo(null).perspectiveTransform(new Vector3(0.0, 0.0, 0.0)); return new Offset(transformed3.x, transformed3.y); } test('RenderViewport basic test - right', () { RenderBox a, b, c, d, e; final RenderViewport root = new RenderViewport( axisDirection: AxisDirection.right, crossAxisDirection: AxisDirection.down, offset: new ViewportOffset.zero(), children: <RenderSliver>[ new RenderSliverToBoxAdapter(child: a = new RenderSizedBox(const Size(400.0, 100.0))), new RenderSliverToBoxAdapter(child: b = new RenderSizedBox(const Size(400.0, 100.0))), new RenderSliverToBoxAdapter(child: c = new RenderSizedBox(const Size(400.0, 100.0))), new RenderSliverToBoxAdapter(child: d = new RenderSizedBox(const Size(400.0, 100.0))), new RenderSliverToBoxAdapter(child: e = new RenderSizedBox(const Size(400.0, 100.0))), ], ); layout(root); expect(root.size.width, equals(800.0)); expect(root.size.height, equals(600.0)); final RenderSliver sliverA = a.parent; final RenderSliver sliverB = b.parent; final RenderSliver sliverC = c.parent; final RenderSliver sliverD = d.parent; final RenderSliver sliverE = e.parent; expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 0.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(400.0, 0.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(800.0, 0.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(1200.0, 0.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(1600.0, 0.0)); expect(_getPaintOrigin(sliverA), const Offset(0.0, 0.0)); expect(_getPaintOrigin(sliverB), const Offset(400.0, 0.0)); expect(_getPaintOrigin(sliverC), const Offset(800.0, 0.0)); expect(_getPaintOrigin(sliverD), const Offset(1200.0, 0.0)); expect(_getPaintOrigin(sliverE), const Offset(1600.0, 0.0)); root.offset = new ViewportOffset.fixed(200.0); pumpFrame(); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(-200.0, 0.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(200.0, 0.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(600.0, 0.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(1000.0, 0.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(1400.0, 0.0)); expect(_getPaintOrigin(sliverA), const Offset(000.0, 0.0)); expect(_getPaintOrigin(sliverB), const Offset(200.0, 0.0)); expect(_getPaintOrigin(sliverC), const Offset(600.0, 0.0)); expect(_getPaintOrigin(sliverD), const Offset(1000.0, 0.0)); expect(_getPaintOrigin(sliverE), const Offset(1400.0, 0.0)); root.offset = new ViewportOffset.fixed(600.0); pumpFrame(); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(-600.0, 0.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(-200.0, 0.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(200.0, 0.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(600.0, 0.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(1000.0, 0.0)); expect(_getPaintOrigin(sliverA), const Offset(000.0, 0.0)); expect(_getPaintOrigin(sliverB), const Offset(000.0, 0.0)); expect(_getPaintOrigin(sliverC), const Offset(200.0, 0.0)); expect(_getPaintOrigin(sliverD), const Offset(600.0, 0.0)); expect(_getPaintOrigin(sliverE), const Offset(1000.0, 0.0)); root.offset = new ViewportOffset.fixed(900.0); pumpFrame(); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(-900.0, 0.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(-500.0, 0.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(-100.0, 0.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(300.0, 0.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(700.0, 0.0)); expect(_getPaintOrigin(sliverA), const Offset(000.0, 0.0)); expect(_getPaintOrigin(sliverB), const Offset(000.0, 0.0)); expect(_getPaintOrigin(sliverC), const Offset(000.0, 0.0)); expect(_getPaintOrigin(sliverD), const Offset(300.0, 0.0)); expect(_getPaintOrigin(sliverE), const Offset(700.0, 0.0)); final HitTestResult result = new HitTestResult(); root.hitTest(result, position: const Offset(150.0, 450.0)); expect(result.path.first.target, equals(c)); }); test('RenderViewport basic test - left', () { RenderBox a, b, c, d, e; final RenderViewport root = new RenderViewport( axisDirection: AxisDirection.left, crossAxisDirection: AxisDirection.down, offset: new ViewportOffset.zero(), children: <RenderSliver>[ new RenderSliverToBoxAdapter(child: a = new RenderSizedBox(const Size(400.0, 100.0))), new RenderSliverToBoxAdapter(child: b = new RenderSizedBox(const Size(400.0, 100.0))), new RenderSliverToBoxAdapter(child: c = new RenderSizedBox(const Size(400.0, 100.0))), new RenderSliverToBoxAdapter(child: d = new RenderSizedBox(const Size(400.0, 100.0))), new RenderSliverToBoxAdapter(child: e = new RenderSizedBox(const Size(400.0, 100.0))), ], ); layout(root); expect(root.size.width, equals(800.0)); expect(root.size.height, equals(600.0)); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(400.0, 0.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 0.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(-400.0, 0.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(-800.0, 0.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(-1200.0, 0.0)); root.offset = new ViewportOffset.fixed(200.0); pumpFrame(); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(600.0, 0.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(200.0, 0.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(-200.0, 0.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(-600.0, 0.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(-1000.0, 0.0)); root.offset = new ViewportOffset.fixed(600.0); pumpFrame(); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(1000.0, 0.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(600.0, 0.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(200.0, 0.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(-200.0, 0.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(-600.0, 0.0)); root.offset = new ViewportOffset.fixed(900.0); pumpFrame(); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(1300.0, 0.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(900.0, 0.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(500.0, 0.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(100.0, 0.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(-300.0, 0.0)); final HitTestResult result = new HitTestResult(); root.hitTest(result, position: const Offset(550.0, 150.0)); expect(result.path.first.target, equals(c)); }); // TODO(ianh): test anchor // TODO(ianh): test center // TODO(ianh): test semantics test('RenderShrinkWrappingViewport basic test - no children', () { final RenderShrinkWrappingViewport root = new RenderShrinkWrappingViewport( crossAxisDirection: AxisDirection.right, offset: new ViewportOffset.zero(), ); expect(root, hasAGoodToStringDeep); layout(root); root.offset = new ViewportOffset.fixed(900.0); pumpFrame(); }); test('RenderShrinkWrappingViewport basic test - down', () { RenderBox a, b, c, d, e; final RenderShrinkWrappingViewport root = new RenderShrinkWrappingViewport( crossAxisDirection: AxisDirection.right, offset: new ViewportOffset.zero(), children: <RenderSliver>[ new RenderSliverToBoxAdapter(child: a = new RenderSizedBox(const Size(100.0, 400.0))), new RenderSliverToBoxAdapter(child: b = new RenderSizedBox(const Size(100.0, 400.0))), new RenderSliverToBoxAdapter(child: c = new RenderSizedBox(const Size(100.0, 400.0))), new RenderSliverToBoxAdapter(child: d = new RenderSizedBox(const Size(100.0, 400.0))), new RenderSliverToBoxAdapter(child: e = new RenderSizedBox(const Size(100.0, 400.0))), ], ); layout(root); expect(root.size.width, equals(800.0)); expect(root.size.height, equals(600.0)); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 0.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 400.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 800.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 1200.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 1600.0)); expect(a.localToGlobal(const Offset(800.0, 400.0)), const Offset(800.0, 400.0)); expect(b.localToGlobal(const Offset(800.0, 400.0)), const Offset(800.0, 800.0)); expect(c.localToGlobal(const Offset(800.0, 400.0)), const Offset(800.0, 1200.0)); expect(d.localToGlobal(const Offset(800.0, 400.0)), const Offset(800.0, 1600.0)); expect(e.localToGlobal(const Offset(800.0, 400.0)), const Offset(800.0, 2000.0)); root.offset = new ViewportOffset.fixed(200.0); pumpFrame(); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -200.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 200.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 600.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 1000.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 1400.0)); root.offset = new ViewportOffset.fixed(600.0); pumpFrame(); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -600.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -200.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 200.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 600.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 1000.0)); root.offset = new ViewportOffset.fixed(900.0); pumpFrame(); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -900.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -500.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -100.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 300.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 700.0)); final HitTestResult result = new HitTestResult(); root.hitTest(result, position: const Offset(130.0, 150.0)); expect(result.path.first.target, equals(c)); }); test('RenderShrinkWrappingViewport basic test - up', () { RenderBox a, b, c, d, e; final RenderShrinkWrappingViewport root = new RenderShrinkWrappingViewport( axisDirection: AxisDirection.up, crossAxisDirection: AxisDirection.right, offset: new ViewportOffset.zero(), children: <RenderSliver>[ new RenderSliverToBoxAdapter(child: a = new RenderSizedBox(const Size(100.0, 400.0))), new RenderSliverToBoxAdapter(child: b = new RenderSizedBox(const Size(100.0, 400.0))), new RenderSliverToBoxAdapter(child: c = new RenderSizedBox(const Size(100.0, 400.0))), new RenderSliverToBoxAdapter(child: d = new RenderSizedBox(const Size(100.0, 400.0))), new RenderSliverToBoxAdapter(child: e = new RenderSizedBox(const Size(100.0, 400.0))), ], ); layout(root); expect(root.size.width, equals(800.0)); expect(root.size.height, equals(600.0)); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 200.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -200.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -600.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -1000.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -1400.0)); root.offset = new ViewportOffset.fixed(200.0); pumpFrame(); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 400.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 0.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -400.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -800.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -1200.0)); root.offset = new ViewportOffset.fixed(600.0); pumpFrame(); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 800.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 400.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 0.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -400.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -800.0)); root.offset = new ViewportOffset.fixed(900.0); pumpFrame(); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 1100.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 700.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 300.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -100.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, -500.0)); final HitTestResult result = new HitTestResult(); root.hitTest(result, position: const Offset(150.0, 350.0)); expect(result.path.first.target, equals(c)); }); test('RenderShrinkWrappingViewport basic test - right', () { RenderBox a, b, c, d, e; final RenderShrinkWrappingViewport root = new RenderShrinkWrappingViewport( axisDirection: AxisDirection.right, crossAxisDirection: AxisDirection.down, offset: new ViewportOffset.zero(), children: <RenderSliver>[ new RenderSliverToBoxAdapter(child: a = new RenderSizedBox(const Size(400.0, 100.0))), new RenderSliverToBoxAdapter(child: b = new RenderSizedBox(const Size(400.0, 100.0))), new RenderSliverToBoxAdapter(child: c = new RenderSizedBox(const Size(400.0, 100.0))), new RenderSliverToBoxAdapter(child: d = new RenderSizedBox(const Size(400.0, 100.0))), new RenderSliverToBoxAdapter(child: e = new RenderSizedBox(const Size(400.0, 100.0))), ], ); layout(root); expect(root.size.width, equals(800.0)); expect(root.size.height, equals(600.0)); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 0.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(400.0, 0.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(800.0, 0.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(1200.0, 0.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(1600.0, 0.0)); root.offset = new ViewportOffset.fixed(200.0); pumpFrame(); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(-200.0, 0.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(200.0, 0.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(600.0, 0.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(1000.0, 0.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(1400.0, 0.0)); root.offset = new ViewportOffset.fixed(600.0); pumpFrame(); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(-600.0, 0.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(-200.0, 0.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(200.0, 0.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(600.0, 0.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(1000.0, 0.0)); root.offset = new ViewportOffset.fixed(900.0); pumpFrame(); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(-900.0, 0.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(-500.0, 0.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(-100.0, 0.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(300.0, 0.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(700.0, 0.0)); final HitTestResult result = new HitTestResult(); root.hitTest(result, position: const Offset(150.0, 450.0)); expect(result.path.first.target, equals(c)); }); test('RenderShrinkWrappingViewport basic test - left', () { RenderBox a, b, c, d, e; final RenderShrinkWrappingViewport root = new RenderShrinkWrappingViewport( axisDirection: AxisDirection.left, crossAxisDirection: AxisDirection.down, offset: new ViewportOffset.zero(), children: <RenderSliver>[ new RenderSliverToBoxAdapter(child: a = new RenderSizedBox(const Size(400.0, 100.0))), new RenderSliverToBoxAdapter(child: b = new RenderSizedBox(const Size(400.0, 100.0))), new RenderSliverToBoxAdapter(child: c = new RenderSizedBox(const Size(400.0, 100.0))), new RenderSliverToBoxAdapter(child: d = new RenderSizedBox(const Size(400.0, 100.0))), new RenderSliverToBoxAdapter(child: e = new RenderSizedBox(const Size(400.0, 100.0))), ], ); layout(root); expect(root.size.width, equals(800.0)); expect(root.size.height, equals(600.0)); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(400.0, 0.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(0.0, 0.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(-400.0, 0.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(-800.0, 0.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(-1200.0, 0.0)); root.offset = new ViewportOffset.fixed(200.0); pumpFrame(); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(600.0, 0.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(200.0, 0.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(-200.0, 0.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(-600.0, 0.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(-1000.0, 0.0)); root.offset = new ViewportOffset.fixed(600.0); pumpFrame(); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(1000.0, 0.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(600.0, 0.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(200.0, 0.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(-200.0, 0.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(-600.0, 0.0)); root.offset = new ViewportOffset.fixed(900.0); pumpFrame(); expect(a.localToGlobal(const Offset(0.0, 0.0)), const Offset(1300.0, 0.0)); expect(b.localToGlobal(const Offset(0.0, 0.0)), const Offset(900.0, 0.0)); expect(c.localToGlobal(const Offset(0.0, 0.0)), const Offset(500.0, 0.0)); expect(d.localToGlobal(const Offset(0.0, 0.0)), const Offset(100.0, 0.0)); expect(e.localToGlobal(const Offset(0.0, 0.0)), const Offset(-300.0, 0.0)); final HitTestResult result = new HitTestResult(); root.hitTest(result, position: const Offset(550.0, 150.0)); expect(result.path.first.target, equals(c)); }); test('RenderShrinkWrappingViewport shrinkwrap test - 1 child', () { RenderBox child; final RenderBox root = new RenderPositionedBox( child: child = new RenderShrinkWrappingViewport( axisDirection: AxisDirection.left, crossAxisDirection: AxisDirection.down, offset: new ViewportOffset.fixed(200.0), children: <RenderSliver>[ new RenderSliverToBoxAdapter(child: new RenderSizedBox(const Size(400.0, 100.0))), ], ), ); layout(root); expect(root.size.width, equals(800.0)); expect(root.size.height, equals(600.0)); expect(child.size.width, equals(400.0)); expect(child.size.height, equals(600.0)); }); test('RenderShrinkWrappingViewport shrinkwrap test - 2 children', () { RenderBox child; final RenderBox root = new RenderPositionedBox( child: child = new RenderShrinkWrappingViewport( axisDirection: AxisDirection.right, crossAxisDirection: AxisDirection.down, offset: new ViewportOffset.fixed(200.0), children: <RenderSliver>[ new RenderSliverToBoxAdapter(child: new RenderSizedBox(const Size(300.0, 100.0))), new RenderSliverToBoxAdapter(child: new RenderSizedBox(const Size(150.0, 100.0))), ], ), ); layout(root); expect(root.size.width, equals(800.0)); expect(root.size.height, equals(600.0)); expect(child.size.width, equals(450.0)); expect(child.size.height, equals(600.0)); }); test('SliverGeometry toString', () { expect( const SliverGeometry().toString(), equals('SliverGeometry(scrollExtent: 0.0, hidden, maxPaintExtent: 0.0)'), ); expect( const SliverGeometry( scrollExtent: 100.0, paintExtent: 50.0, layoutExtent: 20.0, visible: true, ).toString(), equals( 'SliverGeometry(scrollExtent: 100.0, paintExtent: 50.0, layoutExtent: 20.0, maxPaintExtent: 0.0, cacheExtent: 20.0)', ), ); expect( const SliverGeometry( scrollExtent: 100.0, paintExtent: 0.0, layoutExtent: 20.0, ).toString(), equals( 'SliverGeometry(scrollExtent: 100.0, hidden, layoutExtent: 20.0, maxPaintExtent: 0.0, cacheExtent: 20.0)', ), ); }); test('Sliver paintBounds and semanticBounds - vertical', () { const double height = 150.0; final RenderSliver sliver = new RenderSliverToBoxAdapter( child: new RenderSizedBox(const Size(400.0, height)), ); final RenderViewport root = new RenderViewport( axisDirection: AxisDirection.down, crossAxisDirection: AxisDirection.right, offset: new ViewportOffset.zero(), children: <RenderSliver>[ sliver, ], ); layout(root); final Rect expectedRect = new Rect.fromLTWH(0.0, 0.0, root.size.width, height); expect(sliver.paintBounds, expectedRect); expect(sliver.semanticBounds, expectedRect); }); test('Sliver paintBounds and semanticBounds - horizontal', () { const double width = 150.0; final RenderSliver sliver = new RenderSliverToBoxAdapter( child: new RenderSizedBox(const Size(width, 400.0)), ); final RenderViewport root = new RenderViewport( axisDirection: AxisDirection.right, crossAxisDirection: AxisDirection.down, offset: new ViewportOffset.zero(), children: <RenderSliver>[ sliver, ], ); layout(root); final Rect expectedRect = new Rect.fromLTWH(0.0, 0.0, width, root.size.height); expect(sliver.paintBounds, expectedRect); expect(sliver.semanticBounds, expectedRect); }); }