| // 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_test/flutter_test.dart'; |
| import 'package:flutter/material.dart'; |
| import 'package:flutter/rendering.dart'; |
| |
| import '../rendering/mock_canvas.dart'; |
| |
| final List<String> log = <String>[]; |
| |
| class PathClipper extends CustomClipper<Path> { |
| @override |
| Path getClip(Size size) { |
| log.add('getClip'); |
| return new Path() |
| ..addRect(new Rect.fromLTWH(50.0, 50.0, 100.0, 100.0)); |
| } |
| @override |
| bool shouldReclip(PathClipper oldClipper) => false; |
| } |
| |
| class ValueClipper<T> extends CustomClipper<T> { |
| ValueClipper(this.message, this.value); |
| |
| final String message; |
| final T value; |
| |
| @override |
| T getClip(Size size) { |
| log.add(message); |
| return value; |
| } |
| |
| @override |
| bool shouldReclip(ValueClipper<T> oldClipper) { |
| return oldClipper.message != message || oldClipper.value != value; |
| } |
| } |
| |
| void main() { |
| testWidgets('ClipPath', (WidgetTester tester) async { |
| await tester.pumpWidget( |
| new ClipPath( |
| clipper: new PathClipper(), |
| child: new GestureDetector( |
| behavior: HitTestBehavior.opaque, |
| onTap: () { log.add('tap'); }, |
| ) |
| ) |
| ); |
| expect(log, equals(<String>['getClip'])); |
| |
| await tester.tapAt(const Offset(10.0, 10.0)); |
| expect(log, equals(<String>['getClip'])); |
| log.clear(); |
| |
| await tester.tapAt(const Offset(100.0, 100.0)); |
| expect(log, equals(<String>['tap'])); |
| log.clear(); |
| }); |
| |
| testWidgets('ClipOval', (WidgetTester tester) async { |
| await tester.pumpWidget( |
| new ClipOval( |
| child: new GestureDetector( |
| behavior: HitTestBehavior.opaque, |
| onTap: () { log.add('tap'); }, |
| ) |
| ) |
| ); |
| expect(log, equals(<String>[])); |
| |
| await tester.tapAt(const Offset(10.0, 10.0)); |
| expect(log, equals(<String>[])); |
| log.clear(); |
| |
| await tester.tapAt(const Offset(400.0, 300.0)); |
| expect(log, equals(<String>['tap'])); |
| log.clear(); |
| }); |
| |
| testWidgets('Transparent ClipOval hit test', (WidgetTester tester) async { |
| await tester.pumpWidget( |
| new Opacity( |
| opacity: 0.0, |
| child: new ClipOval( |
| child: new GestureDetector( |
| behavior: HitTestBehavior.opaque, |
| onTap: () { log.add('tap'); }, |
| ) |
| ) |
| ) |
| ); |
| expect(log, equals(<String>[])); |
| |
| await tester.tapAt(const Offset(10.0, 10.0)); |
| expect(log, equals(<String>[])); |
| log.clear(); |
| |
| await tester.tapAt(const Offset(400.0, 300.0)); |
| expect(log, equals(<String>['tap'])); |
| log.clear(); |
| }); |
| |
| testWidgets('ClipRect', (WidgetTester tester) async { |
| await tester.pumpWidget( |
| new Align( |
| alignment: Alignment.topLeft, |
| child: new SizedBox( |
| width: 100.0, |
| height: 100.0, |
| child: new ClipRect( |
| clipper: new ValueClipper<Rect>('a', new Rect.fromLTWH(5.0, 5.0, 10.0, 10.0)), |
| child: new GestureDetector( |
| behavior: HitTestBehavior.opaque, |
| onTap: () { log.add('tap'); }, |
| ) |
| ) |
| ) |
| ) |
| ); |
| expect(log, equals(<String>['a'])); |
| |
| await tester.tapAt(const Offset(10.0, 10.0)); |
| expect(log, equals(<String>['a', 'tap'])); |
| |
| await tester.tapAt(const Offset(100.0, 100.0)); |
| expect(log, equals(<String>['a', 'tap'])); |
| |
| await tester.pumpWidget( |
| new Align( |
| alignment: Alignment.topLeft, |
| child: new SizedBox( |
| width: 100.0, |
| height: 100.0, |
| child: new ClipRect( |
| clipper: new ValueClipper<Rect>('a', new Rect.fromLTWH(5.0, 5.0, 10.0, 10.0)), |
| child: new GestureDetector( |
| behavior: HitTestBehavior.opaque, |
| onTap: () { log.add('tap'); }, |
| ) |
| ) |
| ) |
| ) |
| ); |
| expect(log, equals(<String>['a', 'tap'])); |
| |
| await tester.pumpWidget( |
| new Align( |
| alignment: Alignment.topLeft, |
| child: new SizedBox( |
| width: 200.0, |
| height: 200.0, |
| child: new ClipRect( |
| clipper: new ValueClipper<Rect>('a', new Rect.fromLTWH(5.0, 5.0, 10.0, 10.0)), |
| child: new GestureDetector( |
| behavior: HitTestBehavior.opaque, |
| onTap: () { log.add('tap'); }, |
| ) |
| ) |
| ) |
| ) |
| ); |
| expect(log, equals(<String>['a', 'tap', 'a'])); |
| |
| await tester.pumpWidget( |
| new Align( |
| alignment: Alignment.topLeft, |
| child: new SizedBox( |
| width: 200.0, |
| height: 200.0, |
| child: new ClipRect( |
| clipper: new ValueClipper<Rect>('a', new Rect.fromLTWH(5.0, 5.0, 10.0, 10.0)), |
| child: new GestureDetector( |
| behavior: HitTestBehavior.opaque, |
| onTap: () { log.add('tap'); }, |
| ) |
| ) |
| ) |
| ) |
| ); |
| expect(log, equals(<String>['a', 'tap', 'a'])); |
| |
| await tester.pumpWidget( |
| new Align( |
| alignment: Alignment.topLeft, |
| child: new SizedBox( |
| width: 200.0, |
| height: 200.0, |
| child: new ClipRect( |
| clipper: new ValueClipper<Rect>('b', new Rect.fromLTWH(5.0, 5.0, 10.0, 10.0)), |
| child: new GestureDetector( |
| behavior: HitTestBehavior.opaque, |
| onTap: () { log.add('tap'); }, |
| ) |
| ) |
| ) |
| ) |
| ); |
| expect(log, equals(<String>['a', 'tap', 'a', 'b'])); |
| |
| await tester.pumpWidget( |
| new Align( |
| alignment: Alignment.topLeft, |
| child: new SizedBox( |
| width: 200.0, |
| height: 200.0, |
| child: new ClipRect( |
| clipper: new ValueClipper<Rect>('c', new Rect.fromLTWH(25.0, 25.0, 10.0, 10.0)), |
| child: new GestureDetector( |
| behavior: HitTestBehavior.opaque, |
| onTap: () { log.add('tap'); }, |
| ) |
| ) |
| ) |
| ) |
| ); |
| expect(log, equals(<String>['a', 'tap', 'a', 'b', 'c'])); |
| |
| await tester.tapAt(const Offset(30.0, 30.0)); |
| expect(log, equals(<String>['a', 'tap', 'a', 'b', 'c', 'tap'])); |
| |
| await tester.tapAt(const Offset(100.0, 100.0)); |
| expect(log, equals(<String>['a', 'tap', 'a', 'b', 'c', 'tap'])); |
| }); |
| |
| testWidgets('debugPaintSizeEnabled', (WidgetTester tester) async { |
| await tester.pumpWidget( |
| const ClipRect( |
| child: const Placeholder(), |
| ), |
| ); |
| expect(tester.renderObject(find.byType(ClipRect)).paint, paints |
| ..save() |
| ..clipRect(rect: new Rect.fromLTRB(0.0, 0.0, 800.0, 600.0)) |
| ..save() |
| ..path() // Placeholder |
| ..restore() |
| ..restore() |
| ); |
| debugPaintSizeEnabled = true; |
| expect(tester.renderObject(find.byType(ClipRect)).debugPaint, paints // ignore: INVALID_USE_OF_PROTECTED_MEMBER |
| ..rect(rect: new Rect.fromLTRB(0.0, 0.0, 800.0, 600.0)) |
| ..paragraph() |
| ); |
| debugPaintSizeEnabled = false; |
| }); |
| } |