655 OCMStub([engineMock renderer]).andReturn(renderer_);
656 __block
bool called =
false;
657 __block FlutterPointerEvent last_event;
658 OCMStub([[engineMock ignoringNonObjectArgs] sendPointerEvent:FlutterPointerEvent{}])
659 .andDo((^(NSInvocation* invocation) {
660 FlutterPointerEvent* event;
661 [invocation getArgument:&event atIndex:2];
669 [viewController loadView];
673 CGEventRef cgEventStart = CGEventCreateScrollWheelEvent(NULL, kCGScrollEventUnitPixel, 1, 0);
674 CGEventSetType(cgEventStart, kCGEventScrollWheel);
675 CGEventSetIntegerValueField(cgEventStart, kCGScrollWheelEventScrollPhase, kCGScrollPhaseBegan);
676 CGEventSetIntegerValueField(cgEventStart, kCGScrollWheelEventIsContinuous, 1);
679 [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventStart]];
681 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
682 EXPECT_EQ(last_event.phase, kPanZoomStart);
683 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
684 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
687 CGEventRef cgEventUpdate = CGEventCreateCopy(cgEventStart);
688 CGEventSetIntegerValueField(cgEventUpdate, kCGScrollWheelEventScrollPhase, kCGScrollPhaseChanged);
689 CGEventSetIntegerValueField(cgEventUpdate, kCGScrollWheelEventDeltaAxis2, 1);
690 CGEventSetIntegerValueField(cgEventUpdate, kCGScrollWheelEventDeltaAxis1, 2);
693 [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventUpdate]];
695 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
696 EXPECT_EQ(last_event.phase, kPanZoomUpdate);
697 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
698 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
699 EXPECT_EQ(last_event.pan_x, 8 * viewController.flutterView.layer.contentsScale);
700 EXPECT_EQ(last_event.pan_y, 16 * viewController.flutterView.layer.contentsScale);
704 [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventUpdate]];
706 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
707 EXPECT_EQ(last_event.phase, kPanZoomUpdate);
708 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
709 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
710 EXPECT_EQ(last_event.pan_x, 16 * viewController.flutterView.layer.contentsScale);
711 EXPECT_EQ(last_event.pan_y, 32 * viewController.flutterView.layer.contentsScale);
714 CGEventRef cgEventEnd = CGEventCreateCopy(cgEventStart);
715 CGEventSetIntegerValueField(cgEventEnd, kCGScrollWheelEventScrollPhase, kCGScrollPhaseEnded);
718 [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventEnd]];
720 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
721 EXPECT_EQ(last_event.phase, kPanZoomEnd);
722 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
723 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
726 CGEventRef cgEventMomentumStart = CGEventCreateCopy(cgEventStart);
727 CGEventSetIntegerValueField(cgEventMomentumStart, kCGScrollWheelEventScrollPhase, 0);
728 CGEventSetIntegerValueField(cgEventMomentumStart, kCGScrollWheelEventMomentumPhase,
729 kCGMomentumScrollPhaseBegin);
732 [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventMomentumStart]];
733 EXPECT_FALSE(called);
736 CGEventRef cgEventMomentumUpdate = CGEventCreateCopy(cgEventStart);
737 CGEventSetIntegerValueField(cgEventMomentumUpdate, kCGScrollWheelEventScrollPhase, 0);
738 CGEventSetIntegerValueField(cgEventMomentumUpdate, kCGScrollWheelEventMomentumPhase,
739 kCGMomentumScrollPhaseContinue);
742 [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventMomentumUpdate]];
743 EXPECT_FALSE(called);
746 id touchMock = OCMClassMock([NSTouch
class]);
747 NSSet* touchSet = [NSSet setWithObject:touchMock];
748 id touchEventMock1 = OCMClassMock([NSEvent
class]);
749 OCMStub([touchEventMock1 allTouches]).andReturn(touchSet);
750 CGPoint touchLocation = {0, 0};
751 OCMStub([touchEventMock1 locationInWindow]).andReturn(touchLocation);
752 OCMStub([(NSEvent*)touchEventMock1 timestamp]).andReturn(0.150);
756 [viewController touchesBeganWithEvent:touchEventMock1];
757 EXPECT_FALSE(called);
760 id touchEventMock2 = OCMClassMock([NSEvent
class]);
761 OCMStub([touchEventMock2 allTouches]).andReturn(touchSet);
762 OCMStub([touchEventMock2 locationInWindow]).andReturn(touchLocation);
763 OCMStub([(NSEvent*)touchEventMock2 timestamp]).andReturn(0.005);
767 [viewController touchesBeganWithEvent:touchEventMock2];
769 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindScrollInertiaCancel);
770 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
773 CGEventRef cgEventMomentumEnd = CGEventCreateCopy(cgEventStart);
774 CGEventSetIntegerValueField(cgEventMomentumEnd, kCGScrollWheelEventScrollPhase, 0);
775 CGEventSetIntegerValueField(cgEventMomentumEnd, kCGScrollWheelEventMomentumPhase,
776 kCGMomentumScrollPhaseEnd);
779 [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventMomentumEnd]];
780 EXPECT_FALSE(called);
783 CGEventRef cgEventMayBegin = CGEventCreateCopy(cgEventStart);
784 CGEventSetIntegerValueField(cgEventMayBegin, kCGScrollWheelEventScrollPhase,
785 kCGScrollPhaseMayBegin);
788 [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventMayBegin]];
790 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
791 EXPECT_EQ(last_event.phase, kPanZoomStart);
792 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
793 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
796 CGEventRef cgEventCancel = CGEventCreateCopy(cgEventStart);
797 CGEventSetIntegerValueField(cgEventCancel, kCGScrollWheelEventScrollPhase,
798 kCGScrollPhaseCancelled);
801 [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventCancel]];
803 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
804 EXPECT_EQ(last_event.phase, kPanZoomEnd);
805 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
806 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
809 CGEventRef cgEventDiscrete = CGEventCreateScrollWheelEvent(NULL, kCGScrollEventUnitPixel, 1, 0);
810 CGEventSetType(cgEventDiscrete, kCGEventScrollWheel);
811 CGEventSetIntegerValueField(cgEventDiscrete, kCGScrollWheelEventIsContinuous, 0);
812 CGEventSetIntegerValueField(cgEventDiscrete, kCGScrollWheelEventDeltaAxis2, 1);
813 CGEventSetIntegerValueField(cgEventDiscrete, kCGScrollWheelEventDeltaAxis1, 2);
816 [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventDiscrete]];
818 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindScroll);
820 EXPECT_EQ(last_event.scroll_delta_x, -40 * viewController.flutterView.layer.contentsScale);
821 EXPECT_EQ(last_event.scroll_delta_y, -80 * viewController.flutterView.layer.contentsScale);
825 CGEventRef cgEventDiscreteShift =
826 CGEventCreateScrollWheelEvent(NULL, kCGScrollEventUnitPixel, 1, 0);
827 CGEventSetType(cgEventDiscreteShift, kCGEventScrollWheel);
828 CGEventSetFlags(cgEventDiscreteShift, kCGEventFlagMaskShift);
829 CGEventSetIntegerValueField(cgEventDiscreteShift, kCGScrollWheelEventIsContinuous, 0);
830 CGEventSetIntegerValueField(cgEventDiscreteShift, kCGScrollWheelEventDeltaAxis2,
832 CGEventSetIntegerValueField(cgEventDiscreteShift, kCGScrollWheelEventDeltaAxis1,
836 [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventDiscreteShift]];
838 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindScroll);
840 EXPECT_FLOAT_EQ(last_event.scroll_delta_x, 0.0 * viewController.flutterView.layer.contentsScale);
841 EXPECT_FLOAT_EQ(last_event.scroll_delta_y,
842 -80.0 * viewController.flutterView.layer.contentsScale);
847 [viewController magnifyWithEvent:flutter::testing::MockGestureEvent(NSEventTypeMagnify,
848 NSEventPhaseBegan, 1, 0)];
850 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
851 EXPECT_EQ(last_event.phase, kPanZoomStart);
852 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
853 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
857 [viewController magnifyWithEvent:flutter::testing::MockGestureEvent(NSEventTypeMagnify,
858 NSEventPhaseChanged, 1, 0)];
860 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
861 EXPECT_EQ(last_event.phase, kPanZoomUpdate);
862 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
863 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
864 EXPECT_EQ(last_event.pan_x, 0);
865 EXPECT_EQ(last_event.pan_y, 0);
866 EXPECT_EQ(last_event.scale, 2);
868 EXPECT_EQ(last_event.rotation, 0);
872 [viewController magnifyWithEvent:flutter::testing::MockGestureEvent(NSEventTypeMagnify,
873 NSEventPhaseChanged, 1, 0)];
875 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
876 EXPECT_EQ(last_event.phase, kPanZoomUpdate);
877 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
878 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
879 EXPECT_EQ(last_event.pan_x, 0);
880 EXPECT_EQ(last_event.pan_y, 0);
881 EXPECT_EQ(last_event.scale, 4);
883 EXPECT_EQ(last_event.rotation, 0);
887 [viewController magnifyWithEvent:flutter::testing::MockGestureEvent(NSEventTypeMagnify,
888 NSEventPhaseEnded, 0, 0)];
890 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
891 EXPECT_EQ(last_event.phase, kPanZoomEnd);
892 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
893 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
898 [viewController rotateWithEvent:flutter::testing::MockGestureEvent(NSEventTypeRotate,
899 NSEventPhaseBegan, 1, 0)];
901 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
902 EXPECT_EQ(last_event.phase, kPanZoomStart);
903 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
904 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
908 [viewController rotateWithEvent:flutter::testing::MockGestureEvent(
909 NSEventTypeRotate, NSEventPhaseChanged, 0, -180)];
911 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
912 EXPECT_EQ(last_event.phase, kPanZoomUpdate);
913 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
914 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
915 EXPECT_EQ(last_event.pan_x, 0);
916 EXPECT_EQ(last_event.pan_y, 0);
917 EXPECT_EQ(last_event.scale, 1);
918 EXPECT_EQ(last_event.rotation, M_PI);
922 [viewController rotateWithEvent:flutter::testing::MockGestureEvent(
923 NSEventTypeRotate, NSEventPhaseChanged, 0, -360)];
925 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
926 EXPECT_EQ(last_event.phase, kPanZoomUpdate);
927 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
928 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
929 EXPECT_EQ(last_event.pan_x, 0);
930 EXPECT_EQ(last_event.pan_y, 0);
931 EXPECT_EQ(last_event.scale, 1);
932 EXPECT_EQ(last_event.rotation, 3 * M_PI);
936 [viewController rotateWithEvent:flutter::testing::MockGestureEvent(NSEventTypeRotate,
937 NSEventPhaseEnded, 0, 0)];
939 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
940 EXPECT_EQ(last_event.phase, kPanZoomEnd);
941 EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
942 EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);