Flutter Linux Embedder
fl_mouse_cursor_handler_test.cc
Go to the documentation of this file.
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
6 
8 #include "flutter/shell/platform/linux/testing/fl_mock_binary_messenger.h"
9 
10 #include "gtest/gtest.h"
11 
12 // Activates a system cursor by sending an activateSystemCursor method call with
13 // the given kind, returning whether a response was received.
14 static gboolean activate_system_cursor(FlMockBinaryMessenger* messenger,
15  const gchar* kind) {
18 
19  gboolean called = FALSE;
20  fl_mock_binary_messenger_invoke_standard_method(
21  messenger, "flutter/mousecursor", "activateSystemCursor", args,
22  [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
23  gpointer user_data) {
24  gboolean* called = static_cast<gboolean*>(user_data);
25  *called = TRUE;
26 
27  EXPECT_TRUE(FL_IS_METHOD_SUCCESS_RESPONSE(response));
28  },
29  &called);
30 
31  return called;
32 }
33 
34 // A newly created handler has no cursor set.
35 TEST(FlMouseCursorHandlerTest, InitialCursorName) {
36  g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
37  g_autoptr(FlMouseCursorHandler) handler =
38  fl_mouse_cursor_handler_new(FL_BINARY_MESSENGER(messenger));
39 
40  EXPECT_STREQ(fl_mouse_cursor_handler_get_cursor_name(handler), "");
41 }
42 
43 // Activating a known cursor kind maps it to the matching GTK cursor name.
44 TEST(FlMouseCursorHandlerTest, ActivateSystemCursor) {
45  g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
46  g_autoptr(FlMouseCursorHandler) handler =
47  fl_mouse_cursor_handler_new(FL_BINARY_MESSENGER(messenger));
48 
49  EXPECT_TRUE(activate_system_cursor(messenger, "click"));
50 
51  EXPECT_STREQ(fl_mouse_cursor_handler_get_cursor_name(handler), "pointer");
52 }
53 
54 // The "basic" cursor kind maps to the GTK "default" cursor.
55 TEST(FlMouseCursorHandlerTest, BasicCursor) {
56  g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
57  g_autoptr(FlMouseCursorHandler) handler =
58  fl_mouse_cursor_handler_new(FL_BINARY_MESSENGER(messenger));
59 
60  EXPECT_TRUE(activate_system_cursor(messenger, "basic"));
61 
62  EXPECT_STREQ(fl_mouse_cursor_handler_get_cursor_name(handler), "default");
63 }
64 
65 // An unknown cursor kind falls back to the GTK "default" cursor.
66 TEST(FlMouseCursorHandlerTest, UnknownCursorFallsBackToDefault) {
67  g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
68  g_autoptr(FlMouseCursorHandler) handler =
69  fl_mouse_cursor_handler_new(FL_BINARY_MESSENGER(messenger));
70 
71  EXPECT_TRUE(activate_system_cursor(messenger, "madeUpCursorKind"));
72 
73  EXPECT_STREQ(fl_mouse_cursor_handler_get_cursor_name(handler), "default");
74 }
75 
76 // A call whose argument map omits the "kind" key falls back to the GTK
77 // "default" cursor without crashing.
78 TEST(FlMouseCursorHandlerTest, MissingKindFallsBackToDefault) {
79  g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
80  g_autoptr(FlMouseCursorHandler) handler =
81  fl_mouse_cursor_handler_new(FL_BINARY_MESSENGER(messenger));
82 
83  gboolean called = FALSE;
85  fl_mock_binary_messenger_invoke_standard_method(
86  messenger, "flutter/mousecursor", "activateSystemCursor", args,
87  [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
88  gpointer user_data) {
89  gboolean* called = static_cast<gboolean*>(user_data);
90  *called = TRUE;
91 
92  EXPECT_TRUE(FL_IS_METHOD_SUCCESS_RESPONSE(response));
93  },
94  &called);
95  EXPECT_TRUE(called);
96 
97  EXPECT_STREQ(fl_mouse_cursor_handler_get_cursor_name(handler), "default");
98 }
99 
100 // Changing the cursor emits the cursor-changed signal.
101 TEST(FlMouseCursorHandlerTest, CursorChangedSignal) {
102  g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
103  g_autoptr(FlMouseCursorHandler) handler =
104  fl_mouse_cursor_handler_new(FL_BINARY_MESSENGER(messenger));
105 
106  gboolean cursor_changed = FALSE;
107  g_signal_connect_swapped(
108  handler, "cursor-changed",
109  G_CALLBACK(+[](gboolean* cursor_changed) { *cursor_changed = TRUE; }),
110  &cursor_changed);
111 
112  EXPECT_TRUE(activate_system_cursor(messenger, "grab"));
113 
114  EXPECT_TRUE(cursor_changed);
115  EXPECT_STREQ(fl_mouse_cursor_handler_get_cursor_name(handler), "grab");
116 }
117 
118 // A call with malformed (non-map) arguments returns an error response.
119 TEST(FlMouseCursorHandlerTest, BadArguments) {
120  g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
121  g_autoptr(FlMouseCursorHandler) handler =
122  fl_mouse_cursor_handler_new(FL_BINARY_MESSENGER(messenger));
123 
124  gboolean called = FALSE;
126  fl_mock_binary_messenger_invoke_standard_method(
127  messenger, "flutter/mousecursor", "activateSystemCursor", args,
128  [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
129  gpointer user_data) {
130  gboolean* called = static_cast<gboolean*>(user_data);
131  *called = TRUE;
132 
133  EXPECT_TRUE(FL_IS_METHOD_ERROR_RESPONSE(response));
135  FL_METHOD_ERROR_RESPONSE(response)),
136  "Bad Arguments");
137  },
138  &called);
139  EXPECT_TRUE(called);
140 
141  // The cursor is unchanged.
142  EXPECT_STREQ(fl_mouse_cursor_handler_get_cursor_name(handler), "");
143 }
144 
145 // An unknown method returns a not-implemented response.
146 TEST(FlMouseCursorHandlerTest, UnknownMethod) {
147  g_autoptr(FlMockBinaryMessenger) messenger = fl_mock_binary_messenger_new();
148  g_autoptr(FlMouseCursorHandler) handler =
149  fl_mouse_cursor_handler_new(FL_BINARY_MESSENGER(messenger));
150 
151  gboolean called = FALSE;
153  fl_mock_binary_messenger_invoke_standard_method(
154  messenger, "flutter/mousecursor", "someUnknownMethod", args,
155  [](FlMockBinaryMessenger* messenger, FlMethodResponse* response,
156  gpointer user_data) {
157  gboolean* called = static_cast<gboolean*>(user_data);
158  *called = TRUE;
159 
160  EXPECT_TRUE(FL_IS_METHOD_NOT_IMPLEMENTED_RESPONSE(response));
161  },
162  &called);
163  EXPECT_TRUE(called);
164 }
g_autoptr(FlEngine) engine
const char FlTextDirection FlAssertiveness gpointer user_data
return TRUE
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
G_MODULE_EXPORT const gchar * fl_method_error_response_get_code(FlMethodErrorResponse *self)
const gchar * fl_mouse_cursor_handler_get_cursor_name(FlMouseCursorHandler *self)
FlMouseCursorHandler * fl_mouse_cursor_handler_new(FlBinaryMessenger *messenger)
static gboolean activate_system_cursor(FlMockBinaryMessenger *messenger, const gchar *kind)
TEST(FlMouseCursorHandlerTest, InitialCursorName)
G_MODULE_EXPORT void fl_value_set_string_take(FlValue *self, const gchar *key, FlValue *value)
Definition: fl_value.cc:650
G_MODULE_EXPORT FlValue * fl_value_new_string(const gchar *value)
Definition: fl_value.cc:276
G_MODULE_EXPORT FlValue * fl_value_new_null()
Definition: fl_value.cc:251
G_MODULE_EXPORT FlValue * fl_value_new_map()
Definition: fl_value.cc:366
typedefG_BEGIN_DECLS struct _FlValue FlValue
Definition: fl_value.h:42