| // Copyright 2017 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/widgets.dart'; |
| import 'package:flutter/rendering.dart'; |
| |
| |
| void main() { |
| group('PhysicalShape', () { |
| testWidgets('properties', (WidgetTester tester) async { |
| await tester.pumpWidget( |
| const PhysicalShape( |
| clipper: const ShapeBorderClipper(shape: const CircleBorder()), |
| elevation: 2.0, |
| color: const Color(0xFF0000FF), |
| shadowColor: const Color(0xFF00FF00), |
| ) |
| ); |
| final RenderPhysicalShape renderObject = tester.renderObject(find.byType(PhysicalShape)); |
| expect(renderObject.clipper, const ShapeBorderClipper(shape: const CircleBorder())); |
| expect(renderObject.color, const Color(0xFF0000FF)); |
| expect(renderObject.shadowColor, const Color(0xFF00FF00)); |
| expect(renderObject.elevation, 2.0); |
| }); |
| |
| testWidgets('hit test', (WidgetTester tester) async { |
| await tester.pumpWidget( |
| new PhysicalShape( |
| clipper: const ShapeBorderClipper(shape: const CircleBorder()), |
| elevation: 2.0, |
| color: const Color(0xFF0000FF), |
| shadowColor: const Color(0xFF00FF00), |
| child: new Container(color: const Color(0xFF0000FF)), |
| ) |
| ); |
| |
| final RenderPhysicalShape renderPhysicalShape = |
| tester.renderObject(find.byType(PhysicalShape)); |
| |
| // The viewport is 800x600, the CircleBorder is centered and fits |
| // the shortest edge, so we get a circle of radius 300, centered at |
| // (400, 300). |
| // |
| // We test by sampling a few points around the left-most point of the |
| // circle (100, 300). |
| |
| expect(tester.hitTestOnBinding(const Offset(99.0, 300.0)), doesNotHit(renderPhysicalShape)); |
| expect(tester.hitTestOnBinding(const Offset(100.0, 300.0)), hits(renderPhysicalShape)); |
| expect(tester.hitTestOnBinding(const Offset(100.0, 299.0)), doesNotHit(renderPhysicalShape)); |
| expect(tester.hitTestOnBinding(const Offset(100.0, 301.0)), doesNotHit(renderPhysicalShape)); |
| }); |
| |
| }); |
| |
| } |
| |
| HitsRenderBox hits(RenderBox renderBox) => new HitsRenderBox(renderBox); |
| |
| class HitsRenderBox extends Matcher { |
| const HitsRenderBox(this.renderBox); |
| |
| final RenderBox renderBox; |
| |
| @override |
| Description describe(Description description) => |
| description.add('hit test result contains ').addDescriptionOf(renderBox); |
| |
| @override |
| bool matches(dynamic item, Map<dynamic, dynamic> matchState) { |
| final HitTestResult hitTestResult = item; |
| return hitTestResult.path.where( |
| (HitTestEntry entry) => entry.target == renderBox |
| ).isNotEmpty; |
| } |
| } |
| |
| DoesNotHitRenderBox doesNotHit(RenderBox renderBox) => new DoesNotHitRenderBox(renderBox); |
| |
| class DoesNotHitRenderBox extends Matcher { |
| const DoesNotHitRenderBox(this.renderBox); |
| |
| final RenderBox renderBox; |
| |
| @override |
| Description describe(Description description) => |
| description.add('hit test result doesn\'t contain ').addDescriptionOf(renderBox); |
| |
| @override |
| bool matches(dynamic item, Map<dynamic, dynamic> matchState) { |
| final HitTestResult hitTestResult = item; |
| return hitTestResult.path.where( |
| (HitTestEntry entry) => entry.target == renderBox |
| ).isEmpty; |
| } |
| } |