blob: 261f9991e7d2a161bf51bee946b85d92cd23c259 [file] [log] [blame]
// 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);
}