| // Copyright 2014 The Flutter 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/widgets.dart'; |
| import 'package:flutter_test/flutter_test.dart'; |
| import 'package:flutter/gestures.dart'; |
| import 'package:vector_math/vector_math_64.dart'; |
| |
| import 'gesture_tester.dart'; |
| |
| void main() { |
| setUp(ensureGestureBinding); |
| |
| testGesture('toString control tests', (GestureTester tester) { |
| expect(const PointerDownEvent(), hasOneLineDescription); |
| expect(const PointerDownEvent().toStringFull(), hasOneLineDescription); |
| }); |
| |
| testGesture('nthMouseButton control tests', (GestureTester tester) { |
| expect(nthMouseButton(2), kSecondaryMouseButton); |
| expect(nthStylusButton(2), kSecondaryStylusButton); |
| }); |
| |
| testGesture('smallestButton tests', (GestureTester tester) { |
| expect(smallestButton(0x0), equals(0x0)); |
| expect(smallestButton(0x1), equals(0x1)); |
| expect(smallestButton(0x200), equals(0x200)); |
| expect(smallestButton(0x220), equals(0x20)); |
| }); |
| |
| testGesture('isSingleButton tests', (GestureTester tester) { |
| expect(isSingleButton(0x0), isFalse); |
| expect(isSingleButton(0x1), isTrue); |
| expect(isSingleButton(0x200), isTrue); |
| expect(isSingleButton(0x220), isFalse); |
| }); |
| |
| group('fromMouseEvent', () { |
| const PointerEvent hover = PointerHoverEvent( |
| timeStamp: Duration(days: 1), |
| kind: PointerDeviceKind.unknown, |
| device: 10, |
| position: Offset(101.0, 202.0), |
| buttons: 7, |
| obscured: true, |
| pressureMax: 2.1, |
| pressureMin: 1.1, |
| distance: 11, |
| distanceMax: 110, |
| size: 11, |
| radiusMajor: 11, |
| radiusMinor: 9, |
| radiusMin: 1.1, |
| radiusMax: 22, |
| orientation: 1.1, |
| tilt: 1.1, |
| synthesized: true, |
| ); |
| const PointerEvent move = PointerMoveEvent( |
| timeStamp: Duration(days: 1), |
| kind: PointerDeviceKind.unknown, |
| device: 10, |
| position: Offset(101.0, 202.0), |
| buttons: 7, |
| obscured: true, |
| pressureMax: 2.1, |
| pressureMin: 1.1, |
| distanceMax: 110, |
| size: 11, |
| radiusMajor: 11, |
| radiusMinor: 9, |
| radiusMin: 1.1, |
| radiusMax: 22, |
| orientation: 1.1, |
| tilt: 1.1, |
| synthesized: true, |
| ); |
| |
| test('PointerEnterEvent.fromMouseEvent(hover)', () { |
| final PointerEnterEvent event = PointerEnterEvent.fromMouseEvent(hover); |
| const PointerEnterEvent empty = PointerEnterEvent(); |
| expect(event.timeStamp, hover.timeStamp); |
| expect(event.pointer, empty.pointer); |
| expect(event.kind, hover.kind); |
| expect(event.device, hover.device); |
| expect(event.position, hover.position); |
| expect(event.buttons, hover.buttons); |
| expect(event.down, empty.down); |
| expect(event.obscured, hover.obscured); |
| expect(event.pressure, empty.pressure); |
| expect(event.pressureMin, hover.pressureMin); |
| expect(event.pressureMax, hover.pressureMax); |
| expect(event.distance, hover.distance); |
| expect(event.distanceMax, hover.distanceMax); |
| expect(event.distanceMax, hover.distanceMax); |
| expect(event.size, hover.size); |
| expect(event.radiusMajor, hover.radiusMajor); |
| expect(event.radiusMinor, hover.radiusMinor); |
| expect(event.radiusMin, hover.radiusMin); |
| expect(event.radiusMax, hover.radiusMax); |
| expect(event.orientation, hover.orientation); |
| expect(event.tilt, hover.tilt); |
| expect(event.synthesized, hover.synthesized); |
| }); |
| |
| test('PointerExitEvent.fromMouseEvent(hover)', () { |
| final PointerExitEvent event = PointerExitEvent.fromMouseEvent(hover); |
| const PointerExitEvent empty = PointerExitEvent(); |
| expect(event.timeStamp, hover.timeStamp); |
| expect(event.pointer, empty.pointer); |
| expect(event.kind, hover.kind); |
| expect(event.device, hover.device); |
| expect(event.position, hover.position); |
| expect(event.buttons, hover.buttons); |
| expect(event.down, empty.down); |
| expect(event.obscured, hover.obscured); |
| expect(event.pressure, empty.pressure); |
| expect(event.pressureMin, hover.pressureMin); |
| expect(event.pressureMax, hover.pressureMax); |
| expect(event.distance, hover.distance); |
| expect(event.distanceMax, hover.distanceMax); |
| expect(event.distanceMax, hover.distanceMax); |
| expect(event.size, hover.size); |
| expect(event.radiusMajor, hover.radiusMajor); |
| expect(event.radiusMinor, hover.radiusMinor); |
| expect(event.radiusMin, hover.radiusMin); |
| expect(event.radiusMax, hover.radiusMax); |
| expect(event.orientation, hover.orientation); |
| expect(event.tilt, hover.tilt); |
| expect(event.synthesized, hover.synthesized); |
| }); |
| |
| test('PointerEnterEvent.fromMouseEvent(move)', () { |
| final PointerEnterEvent event = PointerEnterEvent.fromMouseEvent(move); |
| const PointerEnterEvent empty = PointerEnterEvent(); |
| expect(event.timeStamp, move.timeStamp); |
| expect(event.pointer, empty.pointer); |
| expect(event.kind, move.kind); |
| expect(event.device, move.device); |
| expect(event.position, move.position); |
| expect(event.buttons, move.buttons); |
| expect(event.down, move.down); |
| expect(event.obscured, move.obscured); |
| expect(event.pressure, empty.pressure); |
| expect(event.pressureMin, move.pressureMin); |
| expect(event.pressureMax, move.pressureMax); |
| expect(event.distance, move.distance); |
| expect(event.distanceMax, move.distanceMax); |
| expect(event.distanceMax, move.distanceMax); |
| expect(event.size, move.size); |
| expect(event.radiusMajor, move.radiusMajor); |
| expect(event.radiusMinor, move.radiusMinor); |
| expect(event.radiusMin, move.radiusMin); |
| expect(event.radiusMax, move.radiusMax); |
| expect(event.orientation, move.orientation); |
| expect(event.tilt, move.tilt); |
| expect(event.synthesized, move.synthesized); |
| }); |
| |
| test('PointerExitEvent.fromMouseEvent(move)', () { |
| final PointerExitEvent event = PointerExitEvent.fromMouseEvent(move); |
| const PointerExitEvent empty = PointerExitEvent(); |
| expect(event.timeStamp, move.timeStamp); |
| expect(event.pointer, empty.pointer); |
| expect(event.kind, move.kind); |
| expect(event.device, move.device); |
| expect(event.position, move.position); |
| expect(event.buttons, move.buttons); |
| expect(event.down, move.down); |
| expect(event.obscured, move.obscured); |
| expect(event.pressure, empty.pressure); |
| expect(event.pressureMin, move.pressureMin); |
| expect(event.pressureMax, move.pressureMax); |
| expect(event.distance, move.distance); |
| expect(event.distanceMax, move.distanceMax); |
| expect(event.distanceMax, move.distanceMax); |
| expect(event.size, move.size); |
| expect(event.radiusMajor, move.radiusMajor); |
| expect(event.radiusMinor, move.radiusMinor); |
| expect(event.radiusMin, move.radiusMin); |
| expect(event.radiusMax, move.radiusMax); |
| expect(event.orientation, move.orientation); |
| expect(event.tilt, move.tilt); |
| expect(event.synthesized, move.synthesized); |
| }); |
| }); |
| |
| group('Default values of PointerEvents:', () { |
| // Some parameters are intentionally set to a non-trivial value. |
| |
| test('PointerDownEvent', () { |
| const PointerDownEvent event = PointerDownEvent(); |
| expect(event.buttons, kPrimaryButton); |
| }); |
| |
| test('PointerMoveEvent', () { |
| const PointerMoveEvent event = PointerMoveEvent(); |
| expect(event.buttons, kPrimaryButton); |
| }); |
| }); |
| |
| test('paintTransformToPointerEventTransform', () { |
| Matrix4 original = Matrix4.identity(); |
| Matrix4 changed = PointerEvent.removePerspectiveTransform(original); |
| expect(changed, original); |
| |
| original = Matrix4.identity()..scale(3.0); |
| changed = PointerEvent.removePerspectiveTransform(original); |
| expect(changed, isNot(original)); |
| original |
| ..setColumn(2, Vector4(0, 0, 1, 0)) |
| ..setRow(2, Vector4(0, 0, 1, 0)); |
| expect(changed, original); |
| }); |
| |
| test('transformPosition', () { |
| const Offset position = Offset(20, 30); |
| expect(PointerEvent.transformPosition(null, position), position); |
| expect(PointerEvent.transformPosition(Matrix4.identity(), position), position); |
| final Matrix4 transform = Matrix4.translationValues(10, 20, 0); |
| expect(PointerEvent.transformPosition(transform, position), const Offset(20.0 + 10.0, 30.0 + 20.0)); |
| }); |
| |
| test('transformDeltaViaPositions', () { |
| Offset transformedDelta = PointerEvent.transformDeltaViaPositions( |
| untransformedEndPosition: const Offset(20, 30), |
| untransformedDelta: const Offset(5, 5), |
| transform: Matrix4.identity()..scale(2.0, 2.0, 1.0), |
| ); |
| expect(transformedDelta, const Offset(10.0, 10.0)); |
| |
| transformedDelta = PointerEvent.transformDeltaViaPositions( |
| untransformedEndPosition: const Offset(20, 30), |
| transformedEndPosition: const Offset(40, 60), |
| untransformedDelta: const Offset(5, 5), |
| transform: Matrix4.identity()..scale(2.0, 2.0, 1.0), |
| ); |
| expect(transformedDelta, const Offset(10.0, 10.0)); |
| |
| transformedDelta = PointerEvent.transformDeltaViaPositions( |
| untransformedEndPosition: const Offset(20, 30), |
| transformedEndPosition: const Offset(40, 60), |
| untransformedDelta: const Offset(5, 5), |
| transform: null, |
| ); |
| expect(transformedDelta, const Offset(5, 5)); |
| }); |
| |
| test('transforming events', () { |
| final Matrix4 transform = (Matrix4.identity()..scale(2.0, 2.0, 1.0)).multiplied(Matrix4.translationValues(10.0, 20.0, 0.0)); |
| const Offset localPosition = Offset(60, 100); |
| const Offset localDelta = Offset(10, 10); |
| |
| const PointerAddedEvent added = PointerAddedEvent( |
| timeStamp: Duration(seconds: 2), |
| kind: PointerDeviceKind.mouse, |
| device: 1, |
| position: Offset(20, 30), |
| obscured: true, |
| pressureMin: 10, |
| pressureMax: 60, |
| distance: 12, |
| distanceMax: 24, |
| radiusMin: 10, |
| radiusMax: 50, |
| orientation: 2, |
| tilt: 4, |
| ); |
| _expectTransformedEvent( |
| original: added, |
| transform: transform, |
| localPosition: localPosition, |
| ); |
| |
| const PointerCancelEvent cancel = PointerCancelEvent( |
| timeStamp: Duration(seconds: 2), |
| pointer: 45, |
| kind: PointerDeviceKind.mouse, |
| device: 1, |
| position: Offset(20, 30), |
| buttons: 4, |
| obscured: true, |
| pressureMin: 10, |
| pressureMax: 60, |
| distance: 12, |
| distanceMax: 24, |
| size: 10, |
| radiusMajor: 33, |
| radiusMinor: 44, |
| radiusMin: 10, |
| radiusMax: 50, |
| orientation: 2, |
| tilt: 4, |
| ); |
| _expectTransformedEvent( |
| original: cancel, |
| transform: transform, |
| localPosition: localPosition, |
| ); |
| |
| const PointerDownEvent down = PointerDownEvent( |
| timeStamp: Duration(seconds: 2), |
| pointer: 45, |
| kind: PointerDeviceKind.mouse, |
| device: 1, |
| position: Offset(20, 30), |
| buttons: 4, |
| obscured: true, |
| pressure: 34, |
| pressureMin: 10, |
| pressureMax: 60, |
| distanceMax: 24, |
| size: 10, |
| radiusMajor: 33, |
| radiusMinor: 44, |
| radiusMin: 10, |
| radiusMax: 50, |
| orientation: 2, |
| tilt: 4, |
| ); |
| _expectTransformedEvent( |
| original: down, |
| transform: transform, |
| localPosition: localPosition, |
| ); |
| |
| const PointerEnterEvent enter = PointerEnterEvent( |
| timeStamp: Duration(seconds: 2), |
| kind: PointerDeviceKind.mouse, |
| device: 1, |
| position: Offset(20, 30), |
| delta: Offset(5, 5), |
| buttons: 4, |
| obscured: true, |
| pressureMin: 10, |
| pressureMax: 60, |
| distance: 12, |
| distanceMax: 24, |
| size: 10, |
| radiusMajor: 33, |
| radiusMinor: 44, |
| radiusMin: 10, |
| radiusMax: 50, |
| orientation: 2, |
| tilt: 4, |
| synthesized: true, |
| ); |
| _expectTransformedEvent( |
| original: enter, |
| transform: transform, |
| localPosition: localPosition, |
| localDelta: localDelta, |
| ); |
| |
| const PointerExitEvent exit = PointerExitEvent( |
| timeStamp: Duration(seconds: 2), |
| kind: PointerDeviceKind.mouse, |
| device: 1, |
| position: Offset(20, 30), |
| delta: Offset(5, 5), |
| buttons: 4, |
| obscured: true, |
| pressureMin: 10, |
| pressureMax: 60, |
| distance: 12, |
| distanceMax: 24, |
| size: 10, |
| radiusMajor: 33, |
| radiusMinor: 44, |
| radiusMin: 10, |
| radiusMax: 50, |
| orientation: 2, |
| tilt: 4, |
| synthesized: true, |
| ); |
| _expectTransformedEvent( |
| original: exit, |
| transform: transform, |
| localPosition: localPosition, |
| localDelta: localDelta, |
| ); |
| |
| const PointerHoverEvent hover = PointerHoverEvent( |
| timeStamp: Duration(seconds: 2), |
| kind: PointerDeviceKind.mouse, |
| device: 1, |
| position: Offset(20, 30), |
| delta: Offset(5, 5), |
| buttons: 4, |
| obscured: true, |
| pressureMin: 10, |
| pressureMax: 60, |
| distance: 12, |
| distanceMax: 24, |
| size: 10, |
| radiusMajor: 33, |
| radiusMinor: 44, |
| radiusMin: 10, |
| radiusMax: 50, |
| orientation: 2, |
| tilt: 4, |
| synthesized: true, |
| ); |
| _expectTransformedEvent( |
| original: hover, |
| transform: transform, |
| localPosition: localPosition, |
| localDelta: localDelta, |
| ); |
| |
| const PointerMoveEvent move = PointerMoveEvent( |
| timeStamp: Duration(seconds: 2), |
| pointer: 45, |
| kind: PointerDeviceKind.mouse, |
| device: 1, |
| position: Offset(20, 30), |
| delta: Offset(5, 5), |
| buttons: 4, |
| obscured: true, |
| pressure: 34, |
| pressureMin: 10, |
| pressureMax: 60, |
| distanceMax: 24, |
| size: 10, |
| radiusMajor: 33, |
| radiusMinor: 44, |
| radiusMin: 10, |
| radiusMax: 50, |
| orientation: 2, |
| tilt: 4, |
| platformData: 10, |
| synthesized: true, |
| ); |
| _expectTransformedEvent( |
| original: move, |
| transform: transform, |
| localPosition: localPosition, |
| localDelta: localDelta, |
| ); |
| |
| const PointerRemovedEvent removed = PointerRemovedEvent( |
| timeStamp: Duration(seconds: 2), |
| kind: PointerDeviceKind.mouse, |
| device: 1, |
| position: Offset(20, 30), |
| obscured: true, |
| pressureMin: 10, |
| pressureMax: 60, |
| distanceMax: 24, |
| radiusMin: 10, |
| radiusMax: 50, |
| ); |
| _expectTransformedEvent( |
| original: removed, |
| transform: transform, |
| localPosition: localPosition, |
| ); |
| |
| const PointerScrollEvent scroll = PointerScrollEvent( |
| timeStamp: Duration(seconds: 2), |
| kind: PointerDeviceKind.mouse, |
| device: 1, |
| position: Offset(20, 30), |
| ); |
| _expectTransformedEvent( |
| original: scroll, |
| transform: transform, |
| localPosition: localPosition, |
| ); |
| |
| const PointerUpEvent up = PointerUpEvent( |
| timeStamp: Duration(seconds: 2), |
| pointer: 45, |
| kind: PointerDeviceKind.mouse, |
| device: 1, |
| position: Offset(20, 30), |
| buttons: 4, |
| obscured: true, |
| pressure: 34, |
| pressureMin: 10, |
| pressureMax: 60, |
| distance: 12, |
| distanceMax: 24, |
| size: 10, |
| radiusMajor: 33, |
| radiusMinor: 44, |
| radiusMin: 10, |
| radiusMax: 50, |
| orientation: 2, |
| tilt: 4, |
| ); |
| _expectTransformedEvent( |
| original: up, |
| transform: transform, |
| localPosition: localPosition, |
| ); |
| }); |
| } |
| |
| void _expectTransformedEvent({ |
| @required PointerEvent original, |
| @required Matrix4 transform, |
| Offset localDelta, |
| Offset localPosition, |
| }) { |
| expect(original.position, original.localPosition); |
| expect(original.delta, original.localDelta); |
| expect(original.original, isNull); |
| expect(original.transform, isNull); |
| |
| final PointerEvent transformed = original.transformed(transform); |
| expect(transformed.original, same(original)); |
| expect(transformed.transform, transform); |
| expect(transformed.localDelta, localDelta ?? original.localDelta); |
| expect(transformed.localPosition, localPosition ?? original.localPosition); |
| |
| expect(transformed.buttons, original.buttons); |
| expect(transformed.delta, original.delta); |
| expect(transformed.device, original.device); |
| expect(transformed.distance, original.distance); |
| expect(transformed.distanceMax, original.distanceMax); |
| expect(transformed.distanceMin, original.distanceMin); |
| expect(transformed.down, original.down); |
| expect(transformed.kind, original.kind); |
| expect(transformed.obscured, original.obscured); |
| expect(transformed.orientation, original.orientation); |
| expect(transformed.platformData, original.platformData); |
| expect(transformed.pointer, original.pointer); |
| expect(transformed.position, original.position); |
| expect(transformed.pressure, original.pressure); |
| expect(transformed.pressureMax, original.pressureMax); |
| expect(transformed.pressureMin, original.pressureMin); |
| expect(transformed.radiusMajor, original.radiusMajor); |
| expect(transformed.radiusMax, original.radiusMax); |
| expect(transformed.radiusMin, original.radiusMin); |
| expect(transformed.radiusMinor, original.radiusMinor); |
| expect(transformed.size, original.size); |
| expect(transformed.synthesized, original.synthesized); |
| expect(transformed.tilt, original.tilt); |
| expect(transformed.timeStamp, original.timeStamp); |
| } |