709 OCMStub([engineMock renderer]).andReturn(renderer_);
710 __block
bool called =
false;
711 __block FlutterPointerEvent last_event;
712 OCMStub([[engineMock ignoringNonObjectArgs] sendPointerEvent:FlutterPointerEvent{}])
713 .andDo((^(NSInvocation* invocation) {
714 FlutterPointerEvent* event;
715 [invocation getArgument:&event atIndex:2];
723 [viewController loadView];
727 CGEventRef cgEventStart = CGEventCreateScrollWheelEvent(NULL, kCGScrollEventUnitPixel, 1, 0);
728 CGEventSetType(cgEventStart, kCGEventScrollWheel);
729 CGEventSetIntegerValueField(cgEventStart, kCGScrollWheelEventScrollPhase, kCGScrollPhaseBegan);
730 CGEventSetIntegerValueField(cgEventStart, kCGScrollWheelEventIsContinuous, 1);
733 [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventStart]];
735 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
736 EXPECT_EQ(last_event.phase, kPanZoomStart);
737 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
738 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
741 CGEventRef cgEventUpdate = CGEventCreateCopy(cgEventStart);
742 CGEventSetIntegerValueField(cgEventUpdate, kCGScrollWheelEventScrollPhase, kCGScrollPhaseChanged);
743 CGEventSetIntegerValueField(cgEventUpdate, kCGScrollWheelEventDeltaAxis2, 1);
744 CGEventSetIntegerValueField(cgEventUpdate, kCGScrollWheelEventDeltaAxis1, 2);
747 [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventUpdate]];
749 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
750 EXPECT_EQ(last_event.phase, kPanZoomUpdate);
751 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
752 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
753 EXPECT_EQ(last_event.pan_x, 8 * viewController.flutterView.layer.contentsScale);
754 EXPECT_EQ(last_event.pan_y, 16 * viewController.flutterView.layer.contentsScale);
758 [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventUpdate]];
760 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
761 EXPECT_EQ(last_event.phase, kPanZoomUpdate);
762 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
763 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
764 EXPECT_EQ(last_event.pan_x, 16 * viewController.flutterView.layer.contentsScale);
765 EXPECT_EQ(last_event.pan_y, 32 * viewController.flutterView.layer.contentsScale);
768 CGEventRef cgEventEnd = CGEventCreateCopy(cgEventStart);
769 CGEventSetIntegerValueField(cgEventEnd, kCGScrollWheelEventScrollPhase, kCGScrollPhaseEnded);
772 [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventEnd]];
774 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
775 EXPECT_EQ(last_event.phase, kPanZoomEnd);
776 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
777 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
780 CGEventRef cgEventMomentumStart = CGEventCreateCopy(cgEventStart);
781 CGEventSetIntegerValueField(cgEventMomentumStart, kCGScrollWheelEventScrollPhase, 0);
782 CGEventSetIntegerValueField(cgEventMomentumStart, kCGScrollWheelEventMomentumPhase,
783 kCGMomentumScrollPhaseBegin);
786 [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventMomentumStart]];
787 EXPECT_FALSE(called);
790 CGEventRef cgEventMomentumUpdate = CGEventCreateCopy(cgEventStart);
791 CGEventSetIntegerValueField(cgEventMomentumUpdate, kCGScrollWheelEventScrollPhase, 0);
792 CGEventSetIntegerValueField(cgEventMomentumUpdate, kCGScrollWheelEventMomentumPhase,
793 kCGMomentumScrollPhaseContinue);
796 [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventMomentumUpdate]];
797 EXPECT_FALSE(called);
800 id touchMock = OCMClassMock([NSTouch
class]);
801 NSSet* touchSet = [NSSet setWithObject:touchMock];
802 id touchEventMock1 = OCMClassMock([NSEvent
class]);
803 OCMStub([touchEventMock1 allTouches]).andReturn(touchSet);
804 CGPoint touchLocation = {0, 0};
805 OCMStub([touchEventMock1 locationInWindow]).andReturn(touchLocation);
806 OCMStub([(NSEvent*)touchEventMock1 timestamp]).andReturn(0.150);
810 [viewController touchesBeganWithEvent:touchEventMock1];
811 EXPECT_FALSE(called);
814 id touchEventMock2 = OCMClassMock([NSEvent
class]);
815 OCMStub([touchEventMock2 allTouches]).andReturn(touchSet);
816 OCMStub([touchEventMock2 locationInWindow]).andReturn(touchLocation);
817 OCMStub([(NSEvent*)touchEventMock2 timestamp]).andReturn(0.005);
821 [viewController touchesBeganWithEvent:touchEventMock2];
823 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindScrollInertiaCancel);
824 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
827 CGEventRef cgEventMomentumEnd = CGEventCreateCopy(cgEventStart);
828 CGEventSetIntegerValueField(cgEventMomentumEnd, kCGScrollWheelEventScrollPhase, 0);
829 CGEventSetIntegerValueField(cgEventMomentumEnd, kCGScrollWheelEventMomentumPhase,
830 kCGMomentumScrollPhaseEnd);
833 [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventMomentumEnd]];
834 EXPECT_FALSE(called);
837 CGEventRef cgEventMayBegin = CGEventCreateCopy(cgEventStart);
838 CGEventSetIntegerValueField(cgEventMayBegin, kCGScrollWheelEventScrollPhase,
839 kCGScrollPhaseMayBegin);
842 [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventMayBegin]];
844 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
845 EXPECT_EQ(last_event.phase, kPanZoomStart);
846 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
847 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
850 CGEventRef cgEventCancel = CGEventCreateCopy(cgEventStart);
851 CGEventSetIntegerValueField(cgEventCancel, kCGScrollWheelEventScrollPhase,
852 kCGScrollPhaseCancelled);
855 [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventCancel]];
857 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
858 EXPECT_EQ(last_event.phase, kPanZoomEnd);
859 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
860 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
863 CGEventRef cgEventDiscrete = CGEventCreateScrollWheelEvent(NULL, kCGScrollEventUnitPixel, 1, 0);
864 CGEventSetType(cgEventDiscrete, kCGEventScrollWheel);
865 CGEventSetIntegerValueField(cgEventDiscrete, kCGScrollWheelEventIsContinuous, 0);
866 CGEventSetIntegerValueField(cgEventDiscrete, kCGScrollWheelEventDeltaAxis2, 1);
867 CGEventSetIntegerValueField(cgEventDiscrete, kCGScrollWheelEventDeltaAxis1, 2);
870 [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventDiscrete]];
872 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindScroll);
874 EXPECT_EQ(last_event.scroll_delta_x, -40 * viewController.flutterView.layer.contentsScale);
875 EXPECT_EQ(last_event.scroll_delta_y, -80 * viewController.flutterView.layer.contentsScale);
879 CGEventRef cgEventDiscreteShift =
880 CGEventCreateScrollWheelEvent(NULL, kCGScrollEventUnitPixel, 1, 0);
881 CGEventSetType(cgEventDiscreteShift, kCGEventScrollWheel);
883 CGEventSetIntegerValueField(cgEventDiscreteShift, kCGScrollWheelEventIsContinuous, 0);
884 CGEventSetIntegerValueField(cgEventDiscreteShift, kCGScrollWheelEventDeltaAxis2,
886 CGEventSetIntegerValueField(cgEventDiscreteShift, kCGScrollWheelEventDeltaAxis1,
890 [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventDiscreteShift]];
892 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindScroll);
894 EXPECT_FLOAT_EQ(last_event.scroll_delta_x, 0.0 * viewController.flutterView.layer.contentsScale);
895 EXPECT_FLOAT_EQ(last_event.scroll_delta_y,
896 -80.0 * viewController.flutterView.layer.contentsScale);
901 [viewController magnifyWithEvent:flutter::testing::MockGestureEvent(NSEventTypeMagnify,
902 NSEventPhaseBegan, 1, 0)];
904 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
905 EXPECT_EQ(last_event.phase, kPanZoomStart);
906 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
907 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
911 [viewController magnifyWithEvent:flutter::testing::MockGestureEvent(NSEventTypeMagnify,
912 NSEventPhaseChanged, 1, 0)];
914 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
915 EXPECT_EQ(last_event.phase, kPanZoomUpdate);
916 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
917 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
918 EXPECT_EQ(last_event.pan_x, 0);
919 EXPECT_EQ(last_event.pan_y, 0);
920 EXPECT_EQ(last_event.scale, 2);
922 EXPECT_EQ(last_event.rotation, 0);
926 [viewController magnifyWithEvent:flutter::testing::MockGestureEvent(NSEventTypeMagnify,
927 NSEventPhaseChanged, 1, 0)];
929 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
930 EXPECT_EQ(last_event.phase, kPanZoomUpdate);
931 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
932 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
933 EXPECT_EQ(last_event.pan_x, 0);
934 EXPECT_EQ(last_event.pan_y, 0);
935 EXPECT_EQ(last_event.scale, 4);
937 EXPECT_EQ(last_event.rotation, 0);
941 [viewController magnifyWithEvent:flutter::testing::MockGestureEvent(NSEventTypeMagnify,
942 NSEventPhaseEnded, 0, 0)];
944 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
945 EXPECT_EQ(last_event.phase, kPanZoomEnd);
946 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
947 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
952 [viewController rotateWithEvent:flutter::testing::MockGestureEvent(NSEventTypeRotate,
953 NSEventPhaseBegan, 1, 0)];
955 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
956 EXPECT_EQ(last_event.phase, kPanZoomStart);
957 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
958 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
962 [viewController rotateWithEvent:flutter::testing::MockGestureEvent(
963 NSEventTypeRotate, NSEventPhaseChanged, 0, -180)];
965 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
966 EXPECT_EQ(last_event.phase, kPanZoomUpdate);
967 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
968 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
969 EXPECT_EQ(last_event.pan_x, 0);
970 EXPECT_EQ(last_event.pan_y, 0);
971 EXPECT_EQ(last_event.scale, 1);
972 EXPECT_EQ(last_event.rotation, M_PI);
976 [viewController rotateWithEvent:flutter::testing::MockGestureEvent(
977 NSEventTypeRotate, NSEventPhaseChanged, 0, -360)];
979 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
980 EXPECT_EQ(last_event.phase, kPanZoomUpdate);
981 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
982 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
983 EXPECT_EQ(last_event.pan_x, 0);
984 EXPECT_EQ(last_event.pan_y, 0);
985 EXPECT_EQ(last_event.scale, 1);
986 EXPECT_EQ(last_event.rotation, 3 * M_PI);
990 [viewController rotateWithEvent:flutter::testing::MockGestureEvent(NSEventTypeRotate,
991 NSEventPhaseEnded, 0, 0)];
993 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
994 EXPECT_EQ(last_event.phase, kPanZoomEnd);
995 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
996 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
1000 [viewController rotateWithEvent:flutter::testing::MockGestureEvent(NSEventTypeRotate,
1001 NSEventPhaseCancelled, 0, 0)];
1002 EXPECT_FALSE(called);