@@ -30,13 +30,19 @@ using fup_TouchPointerSample = fuchsia::ui::pointer::TouchPointerSample;
30
30
using fup_TouchResponse = fuchsia::ui::pointer::TouchResponse;
31
31
using fup_TouchResponseType = fuchsia::ui::pointer::TouchResponseType;
32
32
using fup_ViewParameters = fuchsia::ui::pointer::ViewParameters;
33
+ using fup_MouseEvent = fuchsia::ui::pointer::MouseEvent;
33
34
34
35
constexpr std::array<std::array<float , 2 >, 2 > kRect = {{{0 , 0 }, {20 , 20 }}};
35
36
constexpr std::array<float , 9 > kIdentity = {1 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 1 };
36
37
constexpr fup_TouchIxnId kIxnOne = {.device_id = 1u ,
37
38
.pointer_id = 1u ,
38
39
.interaction_id = 2u };
39
40
41
+ constexpr uint32_t kMouseDeviceId = 123 ;
42
+ constexpr std::array<int64_t , 2 > kNoScrollInPhysicalPixelDelta = {0 , 0 };
43
+ const bool kNotPrecisionScroll = false ;
44
+ const bool kPrecisionScroll = true ;
45
+
40
46
// Fixture to exercise Flutter runner's implementation for
41
47
// fuchsia.ui.pointer.TouchSource.
42
48
class PointerDelegateTest : public ::testing::Test {
@@ -676,4 +682,163 @@ TEST_F(PointerDelegateTest, Protocol_PointersAreIndependent) {
676
682
pointers = {};
677
683
}
678
684
685
+ TEST_F (PointerDelegateTest, MouseWheel_TickBased) {
686
+ std::optional<std::vector<flutter::PointerData>> pointers;
687
+ pointer_delegate_->WatchLoop (
688
+ [&pointers](std::vector<flutter::PointerData> events) {
689
+ pointers = std::move (events);
690
+ });
691
+ RunLoopUntilIdle (); // Server gets watch call.
692
+
693
+ std::vector<fup_MouseEvent> events =
694
+ MouseEventBuilder ()
695
+ .AddTime (1111789u )
696
+ .AddViewParameters (kRect , kRect , kIdentity )
697
+ .AddSample (kMouseDeviceId , {10 .f , 10 .f }, {}, {0 , 1 },
698
+ kNoScrollInPhysicalPixelDelta , kNotPrecisionScroll )
699
+ .AddMouseDeviceInfo (kMouseDeviceId , {0 , 1 , 2 })
700
+ .BuildAsVector ();
701
+ mouse_source_->ScheduleCallback (std::move (events));
702
+ RunLoopUntilIdle ();
703
+
704
+ ASSERT_TRUE (pointers.has_value ());
705
+ ASSERT_EQ (pointers.value ().size (), 1u );
706
+ EXPECT_EQ (pointers.value ()[0 ].change , flutter::PointerData::Change::kHover );
707
+ EXPECT_EQ (pointers.value ()[0 ].signal_kind ,
708
+ flutter::PointerData::SignalKind::kScroll );
709
+ EXPECT_EQ (pointers.value ()[0 ].kind , flutter::PointerData::DeviceKind::kMouse );
710
+ EXPECT_EQ (pointers.value ()[0 ].buttons , 0 );
711
+ EXPECT_EQ (pointers.value ()[0 ].scroll_delta_x , 0 );
712
+ EXPECT_EQ (pointers.value ()[0 ].scroll_delta_y , -20 );
713
+ pointers = {};
714
+
715
+ // receive a horizontal scroll
716
+ events = MouseEventBuilder ()
717
+ .AddTime (1111789u )
718
+ .AddViewParameters (kRect , kRect , kIdentity )
719
+ .AddSample (kMouseDeviceId , {10 .f , 10 .f }, {}, {1 , 0 },
720
+ kNoScrollInPhysicalPixelDelta , kNotPrecisionScroll )
721
+ .AddMouseDeviceInfo (kMouseDeviceId , {0 , 1 , 2 })
722
+ .BuildAsVector ();
723
+ mouse_source_->ScheduleCallback (std::move (events));
724
+ RunLoopUntilIdle ();
725
+
726
+ ASSERT_TRUE (pointers.has_value ());
727
+ ASSERT_EQ (pointers.value ().size (), 1u );
728
+ EXPECT_EQ (pointers.value ()[0 ].change , flutter::PointerData::Change::kHover );
729
+ EXPECT_EQ (pointers.value ()[0 ].signal_kind ,
730
+ flutter::PointerData::SignalKind::kScroll );
731
+ EXPECT_EQ (pointers.value ()[0 ].kind , flutter::PointerData::DeviceKind::kMouse );
732
+ EXPECT_EQ (pointers.value ()[0 ].buttons , 0 );
733
+ EXPECT_EQ (pointers.value ()[0 ].scroll_delta_x , 20 );
734
+ EXPECT_EQ (pointers.value ()[0 ].scroll_delta_y , 0 );
735
+ pointers = {};
736
+ }
737
+
738
+ TEST_F (PointerDelegateTest, MouseWheel_PixelBased) {
739
+ std::optional<std::vector<flutter::PointerData>> pointers;
740
+ pointer_delegate_->WatchLoop (
741
+ [&pointers](std::vector<flutter::PointerData> events) {
742
+ pointers = std::move (events);
743
+ });
744
+ RunLoopUntilIdle (); // Server gets watch call.
745
+
746
+ std::vector<fup_MouseEvent> events =
747
+ MouseEventBuilder ()
748
+ .AddTime (1111789u )
749
+ .AddViewParameters (kRect , kRect , kIdentity )
750
+ .AddSample (kMouseDeviceId , {10 .f , 10 .f }, {}, {0 , 1 }, {0 , 120 },
751
+ kNotPrecisionScroll )
752
+ .AddMouseDeviceInfo (kMouseDeviceId , {0 , 1 , 2 })
753
+ .BuildAsVector ();
754
+ mouse_source_->ScheduleCallback (std::move (events));
755
+ RunLoopUntilIdle ();
756
+
757
+ ASSERT_TRUE (pointers.has_value ());
758
+ ASSERT_EQ (pointers.value ().size (), 1u );
759
+ EXPECT_EQ (pointers.value ()[0 ].change , flutter::PointerData::Change::kHover );
760
+ EXPECT_EQ (pointers.value ()[0 ].signal_kind ,
761
+ flutter::PointerData::SignalKind::kScroll );
762
+ EXPECT_EQ (pointers.value ()[0 ].kind , flutter::PointerData::DeviceKind::kMouse );
763
+ EXPECT_EQ (pointers.value ()[0 ].buttons , 0 );
764
+ EXPECT_EQ (pointers.value ()[0 ].scroll_delta_x , 0 );
765
+ EXPECT_EQ (pointers.value ()[0 ].scroll_delta_y , -120 );
766
+ pointers = {};
767
+
768
+ // receive a horizontal scroll
769
+ events = MouseEventBuilder ()
770
+ .AddTime (1111789u )
771
+ .AddViewParameters (kRect , kRect , kIdentity )
772
+ .AddSample (kMouseDeviceId , {10 .f , 10 .f }, {}, {1 , 0 }, {120 , 0 },
773
+ kNotPrecisionScroll )
774
+ .AddMouseDeviceInfo (kMouseDeviceId , {0 , 1 , 2 })
775
+ .BuildAsVector ();
776
+ mouse_source_->ScheduleCallback (std::move (events));
777
+ RunLoopUntilIdle ();
778
+
779
+ ASSERT_TRUE (pointers.has_value ());
780
+ ASSERT_EQ (pointers.value ().size (), 1u );
781
+ EXPECT_EQ (pointers.value ()[0 ].change , flutter::PointerData::Change::kHover );
782
+ EXPECT_EQ (pointers.value ()[0 ].signal_kind ,
783
+ flutter::PointerData::SignalKind::kScroll );
784
+ EXPECT_EQ (pointers.value ()[0 ].kind , flutter::PointerData::DeviceKind::kMouse );
785
+ EXPECT_EQ (pointers.value ()[0 ].buttons , 0 );
786
+ EXPECT_EQ (pointers.value ()[0 ].scroll_delta_x , 120 );
787
+ EXPECT_EQ (pointers.value ()[0 ].scroll_delta_y , 0 );
788
+ pointers = {};
789
+ }
790
+
791
+ TEST_F (PointerDelegateTest, MouseWheel_TouchpadPixelBased) {
792
+ std::optional<std::vector<flutter::PointerData>> pointers;
793
+ pointer_delegate_->WatchLoop (
794
+ [&pointers](std::vector<flutter::PointerData> events) {
795
+ pointers = std::move (events);
796
+ });
797
+ RunLoopUntilIdle (); // Server gets watch call.
798
+
799
+ std::vector<fup_MouseEvent> events =
800
+ MouseEventBuilder ()
801
+ .AddTime (1111789u )
802
+ .AddViewParameters (kRect , kRect , kIdentity )
803
+ .AddSample (kMouseDeviceId , {10 .f , 10 .f }, {}, {0 , 1 }, {0 , 120 },
804
+ kPrecisionScroll )
805
+ .AddMouseDeviceInfo (kMouseDeviceId , {0 , 1 , 2 })
806
+ .BuildAsVector ();
807
+ mouse_source_->ScheduleCallback (std::move (events));
808
+ RunLoopUntilIdle ();
809
+
810
+ ASSERT_TRUE (pointers.has_value ());
811
+ ASSERT_EQ (pointers.value ().size (), 1u );
812
+ EXPECT_EQ (pointers.value ()[0 ].change , flutter::PointerData::Change::kHover );
813
+ EXPECT_EQ (pointers.value ()[0 ].signal_kind ,
814
+ flutter::PointerData::SignalKind::kScroll );
815
+ EXPECT_EQ (pointers.value ()[0 ].kind , flutter::PointerData::DeviceKind::kMouse );
816
+ EXPECT_EQ (pointers.value ()[0 ].buttons , 0 );
817
+ EXPECT_EQ (pointers.value ()[0 ].scroll_delta_x , 0 );
818
+ EXPECT_EQ (pointers.value ()[0 ].scroll_delta_y , -120 );
819
+ pointers = {};
820
+
821
+ // receive a horizontal scroll
822
+ events = MouseEventBuilder ()
823
+ .AddTime (1111789u )
824
+ .AddViewParameters (kRect , kRect , kIdentity )
825
+ .AddSample (kMouseDeviceId , {10 .f , 10 .f }, {}, {1 , 0 }, {120 , 0 },
826
+ kPrecisionScroll )
827
+ .AddMouseDeviceInfo (kMouseDeviceId , {0 , 1 , 2 })
828
+ .BuildAsVector ();
829
+ mouse_source_->ScheduleCallback (std::move (events));
830
+ RunLoopUntilIdle ();
831
+
832
+ ASSERT_TRUE (pointers.has_value ());
833
+ ASSERT_EQ (pointers.value ().size (), 1u );
834
+ EXPECT_EQ (pointers.value ()[0 ].change , flutter::PointerData::Change::kHover );
835
+ EXPECT_EQ (pointers.value ()[0 ].signal_kind ,
836
+ flutter::PointerData::SignalKind::kScroll );
837
+ EXPECT_EQ (pointers.value ()[0 ].kind , flutter::PointerData::DeviceKind::kMouse );
838
+ EXPECT_EQ (pointers.value ()[0 ].buttons , 0 );
839
+ EXPECT_EQ (pointers.value ()[0 ].scroll_delta_x , 120 );
840
+ EXPECT_EQ (pointers.value ()[0 ].scroll_delta_y , 0 );
841
+ pointers = {};
842
+ }
843
+
679
844
} // namespace flutter_runner::testing
0 commit comments