7#include "gtest/gtest.h"
32 EXPECT_EQ(displays_length, 2u);
34 EXPECT_EQ(
displays[0].display_id, 1u);
35 EXPECT_EQ(
displays[0].refresh_rate, 60);
38 EXPECT_EQ(
displays[0].device_pixel_ratio, 1.0);
40 EXPECT_EQ(
displays[1].display_id, 2u);
41 EXPECT_EQ(
displays[1].refresh_rate, 120);
44 EXPECT_EQ(
displays[1].device_pixel_ratio, 2.0);
53 .single_display =
false,
57 .device_pixel_ratio = 1.0,
62 .single_display =
false,
63 .refresh_rate = 120.0,
66 .device_pixel_ratio = 2.0,
79 SendWindowMetricsEvent,
84 EXPECT_EQ(event->
width, 800u);
85 EXPECT_EQ(event->
height, 600u);
107 size_t events_count) {
109 EXPECT_EQ(events_count,
static_cast<size_t>(1));
110 EXPECT_EQ(events[0].
view_id, 1);
111 EXPECT_EQ(events[0].phase,
kDown);
112 EXPECT_EQ(events[0].timestamp,
static_cast<size_t>(1234567890));
113 EXPECT_EQ(events[0].
x, 800);
114 EXPECT_EQ(events[0].
y, 600);
115 EXPECT_EQ(events[0].
device,
static_cast<int32_t
>(0));
117 EXPECT_EQ(events[0].scroll_delta_x, 1.2);
118 EXPECT_EQ(events[0].scroll_delta_y, -3.4);
135 bool device_state_sent =
false;
139 size_t events_count) {
140 device_state_sent =
true;
141 EXPECT_EQ(events_count,
static_cast<size_t>(1));
142 EXPECT_DOUBLE_EQ(events[0].pressure, 0.5);
143 EXPECT_DOUBLE_EQ(events[0].pressure_min, 0.0);
144 EXPECT_DOUBLE_EQ(events[0].pressure_max, 1.0);
145 EXPECT_DOUBLE_EQ(events[0].rotation, G_PI / 2.0);
155 EXPECT_TRUE(device_state_sent);
164 size_t events_count) {
166 EXPECT_EQ(events_count,
static_cast<size_t>(1));
167 EXPECT_EQ(events[0].
view_id, 1);
169 EXPECT_EQ(events[0].timestamp,
static_cast<size_t>(1234567890));
170 EXPECT_EQ(events[0].
x, 800);
171 EXPECT_EQ(events[0].
y, 600);
172 EXPECT_EQ(events[0].
device,
static_cast<int32_t
>(1));
174 EXPECT_EQ(events[0].pan_x, 1.5);
175 EXPECT_EQ(events[0].pan_y, 2.5);
176 EXPECT_EQ(events[0].scale, 3.5);
177 EXPECT_EQ(events[0].rotation, 4.5);
179 EXPECT_EQ(events[0].buttons, 0);
197 EXPECT_EQ(info->
view_id,
static_cast<int64_t
>(456));
198 EXPECT_EQ(info->
node_id,
static_cast<uint64_t
>(42));
200 EXPECT_EQ(info->
data_length,
static_cast<size_t>(4));
201 EXPECT_EQ(info->
data[0],
't');
202 EXPECT_EQ(info->
data[1],
'e');
203 EXPECT_EQ(info->
data[2],
's');
204 EXPECT_EQ(info->
data[3],
't');
211 g_autoptr(GBytes) data = g_bytes_new_static(
"test", 4);
225 ([&called, old_handler](
auto engine,
227 if (strcmp(
message->channel,
"test") != 0) {
228 return old_handler(engine, message);
233 EXPECT_EQ(
message->message_size,
static_cast<size_t>(4));
234 EXPECT_EQ(
message->message[0],
't');
235 EXPECT_EQ(
message->message[1],
'e');
236 EXPECT_EQ(
message->message[2],
's');
237 EXPECT_EQ(
message->message[3],
't');
255 SendPlatformMessageResponse,
258 const uint8_t* data,
size_t data_length) {
265 EXPECT_EQ(data_length,
static_cast<size_t>(4));
266 EXPECT_EQ(data[0],
't');
267 EXPECT_EQ(data[1],
'e');
268 EXPECT_EQ(data[2],
's');
269 EXPECT_EQ(data[3],
't');
276 g_autoptr(GBytes) response = g_bytes_new_static(
"test", 4);
280 EXPECT_EQ(
error,
nullptr);
293 EXPECT_STREQ(
message->channel,
"flutter/settings");
300 FL_MESSAGE_CODEC(codec), data, &
error);
301 EXPECT_NE(settings,
nullptr);
302 EXPECT_EQ(
error,
nullptr);
306 EXPECT_NE(text_scale_factor,
nullptr);
309 FlValue* always_use_24hr_format =
311 EXPECT_NE(always_use_24hr_format,
nullptr);
317 EXPECT_NE(platform_brightness,
nullptr);
329 int* count =
reinterpret_cast<int*
>(
user_data);
336 void* callback_user_data;
340 Initialize, ([&
callback, &callback_user_data, &called](
367 g_signal_connect(
engine,
"on-pre-engine-restart",
375 GPtrArray* args_array = g_ptr_array_new();
376 g_ptr_array_add(args_array,
const_cast<char*
>(
"arg_one"));
377 g_ptr_array_add(args_array,
const_cast<char*
>(
"arg_two"));
378 g_ptr_array_add(args_array,
const_cast<char*
>(
"arg_three"));
379 g_ptr_array_add(args_array,
nullptr);
380 gchar**
args =
reinterpret_cast<gchar**
>(g_ptr_array_free(args_array,
false));
386 Initialize, ([&called, &set_args =
args](
391 EXPECT_NE(set_args,
args->dart_entrypoint_argv);
392 EXPECT_EQ(
args->dart_entrypoint_argc, 3);
411 engine_id =
args->engine_id;
418 EXPECT_TRUE(engine_id != 0);
426 bool same_task_runner =
false;
433 same_task_runner =
args->custom_task_runners->platform_task_runner ==
434 args->custom_task_runners->ui_task_runner;
441 EXPECT_TRUE(same_task_runner);
448 bool same_task_runner =
false;
455 same_task_runner =
args->custom_task_runners->platform_task_runner ==
456 args->custom_task_runners->ui_task_runner;
463 EXPECT_TRUE(same_task_runner);
470 bool separate_thread =
false;
477 separate_thread =
args->custom_task_runners->ui_task_runner ==
nullptr;
484 EXPECT_TRUE(separate_thread);
488 g_autofree gchar* initial_language = g_strdup(g_getenv(
"LANGUAGE"));
489 g_setenv(
"LANGUAGE",
"de:en_US",
TRUE);
494 size_t locales_count) {
497 EXPECT_EQ(locales_count,
static_cast<size_t>(4));
499 EXPECT_STREQ(locales[0]->language_code,
"de");
500 EXPECT_STREQ(locales[0]->country_code,
nullptr);
501 EXPECT_STREQ(locales[0]->script_code,
nullptr);
502 EXPECT_STREQ(locales[0]->variant_code,
nullptr);
504 EXPECT_STREQ(locales[1]->language_code,
"en");
505 EXPECT_STREQ(locales[1]->country_code,
"US");
506 EXPECT_STREQ(locales[1]->script_code,
nullptr);
507 EXPECT_STREQ(locales[1]->variant_code,
nullptr);
509 EXPECT_STREQ(locales[2]->language_code,
"en");
510 EXPECT_STREQ(locales[2]->country_code,
nullptr);
511 EXPECT_STREQ(locales[2]->script_code,
nullptr);
512 EXPECT_STREQ(locales[2]->variant_code,
nullptr);
514 EXPECT_STREQ(locales[3]->language_code,
"C");
515 EXPECT_STREQ(locales[3]->country_code,
nullptr);
516 EXPECT_STREQ(locales[3]->script_code,
nullptr);
517 EXPECT_STREQ(locales[3]->variant_code,
nullptr);
526 if (initial_language) {
527 g_setenv(
"LANGUAGE", initial_language,
TRUE);
529 g_unsetenv(
"LANGUAGE");
534 g_autofree gchar* initial_language = g_strdup(g_getenv(
"LANGUAGE"));
535 g_setenv(
"LANGUAGE",
"C",
TRUE);
540 size_t locales_count) {
543 EXPECT_EQ(locales_count,
static_cast<size_t>(1));
545 EXPECT_STREQ(locales[0]->language_code,
"C");
546 EXPECT_STREQ(locales[0]->country_code,
nullptr);
547 EXPECT_STREQ(locales[0]->script_code,
nullptr);
548 EXPECT_STREQ(locales[0]->variant_code,
nullptr);
557 if (initial_language) {
558 g_setenv(
"LANGUAGE", initial_language,
TRUE);
560 g_unsetenv(
"LANGUAGE");
565 g_autofree gchar* initial_language = g_strdup(g_getenv(
"LANGUAGE"));
566 g_setenv(
"LANGUAGE",
"en:en",
TRUE);
571 size_t locales_count) {
574 EXPECT_EQ(locales_count,
static_cast<size_t>(2));
576 EXPECT_STREQ(locales[0]->language_code,
"en");
577 EXPECT_STREQ(locales[0]->country_code,
nullptr);
578 EXPECT_STREQ(locales[0]->script_code,
nullptr);
579 EXPECT_STREQ(locales[0]->variant_code,
nullptr);
581 EXPECT_STREQ(locales[1]->language_code,
"C");
582 EXPECT_STREQ(locales[1]->country_code,
nullptr);
583 EXPECT_STREQ(locales[1]->script_code,
nullptr);
584 EXPECT_STREQ(locales[1]->variant_code,
nullptr);
593 if (initial_language) {
594 g_setenv(
"LANGUAGE", initial_language,
TRUE);
596 g_unsetenv(
"LANGUAGE");
601 g_autofree gchar* initial_language = g_strdup(g_getenv(
"LANGUAGE"));
602 g_setenv(
"LANGUAGE",
"de:: :en_US",
TRUE);
607 size_t locales_count) {
610 EXPECT_EQ(locales_count,
static_cast<size_t>(4));
612 EXPECT_STREQ(locales[0]->language_code,
"de");
613 EXPECT_STREQ(locales[0]->country_code,
nullptr);
614 EXPECT_STREQ(locales[0]->script_code,
nullptr);
615 EXPECT_STREQ(locales[0]->variant_code,
nullptr);
617 EXPECT_STREQ(locales[1]->language_code,
"en");
618 EXPECT_STREQ(locales[1]->country_code,
"US");
619 EXPECT_STREQ(locales[1]->script_code,
nullptr);
620 EXPECT_STREQ(locales[1]->variant_code,
nullptr);
622 EXPECT_STREQ(locales[2]->language_code,
"en");
623 EXPECT_STREQ(locales[2]->country_code,
nullptr);
624 EXPECT_STREQ(locales[2]->script_code,
nullptr);
625 EXPECT_STREQ(locales[2]->variant_code,
nullptr);
627 EXPECT_STREQ(locales[3]->language_code,
"C");
628 EXPECT_STREQ(locales[3]->country_code,
nullptr);
629 EXPECT_STREQ(locales[3]->script_code,
nullptr);
630 EXPECT_STREQ(locales[3]->variant_code,
nullptr);
639 if (initial_language) {
640 g_setenv(
"LANGUAGE", initial_language,
TRUE);
642 g_unsetenv(
"LANGUAGE");
647 GAsyncResult* result,
652 EXPECT_EQ(
error,
nullptr);
654 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
688 g_main_loop_run(loop);
692 GAsyncResult* result,
697 EXPECT_NE(
error,
nullptr);
699 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
707 result.
added =
false;
721 g_main_loop_run(loop);
725 GAsyncResult* result,
730 EXPECT_NE(
error,
nullptr);
732 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
748 g_main_loop_run(loop);
752 GAsyncResult* result,
757 EXPECT_EQ(
error,
nullptr);
759 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
782 g_main_loop_run(loop);
786 GAsyncResult* result,
791 EXPECT_NE(
error,
nullptr);
793 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
811 g_main_loop_run(loop);
815 GAsyncResult* result,
820 EXPECT_NE(
error,
nullptr);
822 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
835 g_main_loop_run(loop);
849 EXPECT_EQ(event->
physical,
static_cast<uint64_t
>(42));
850 EXPECT_EQ(event->
logical,
static_cast<uint64_t
>(123));
867 [](GObject*
object, GAsyncResult* result, gpointer
user_data) {
872 EXPECT_EQ(
error,
nullptr);
873 EXPECT_TRUE(handled);
874 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
878 g_main_loop_run(loop);
905 [](GObject*
object, GAsyncResult* result, gpointer
user_data) {
910 EXPECT_EQ(
error,
nullptr);
911 EXPECT_FALSE(handled);
912 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
916 g_main_loop_run(loop);
944 [](GObject*
object, GAsyncResult* result, gpointer
user_data) {
949 EXPECT_NE(
error,
nullptr);
950 EXPECT_STREQ(
error->message,
"Failed to send key event");
951 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
955 g_main_loop_run(loop);
967 bool has_impeller_switch =
false;
968 for (
int i = 0;
i <
args->command_line_argc;
i++) {
969 if (strcmp(
args->command_line_argv[
i],
"--enable-impeller") == 0) {
970 has_impeller_switch = true;
973 EXPECT_TRUE(has_impeller_switch);
993 bool has_impeller_switch =
false;
994 for (
int i = 0;
i <
args->command_line_argc;
i++) {
995 if (strcmp(
args->command_line_argv[
i],
"--enable-impeller") == 0) {
996 has_impeller_switch = true;
999 EXPECT_FALSE(has_impeller_switch);
1007 EXPECT_EQ(
error,
nullptr);
1008 EXPECT_TRUE(called);
#define FLUTTER_API_SYMBOL(symbol)
@ kFlutterKeyEventDeviceTypeKeyboard
@ kPanZoomUpdate
The pan/zoom updated.
FlutterEngineResult(* FlutterEngineSendPlatformMessageFnPtr)(FLUTTER_API_SYMBOL(FlutterEngine) engine, const FlutterPlatformMessage *message)
@ kFlutterPointerButtonMouseSecondary
@ kFlutterPointerSignalKindScroll
@ kFlutterPointerSignalKindNone
FlutterEngineDisplaysUpdateType
@ kFlutterEngineDisplaysUpdateTypeStartup
@ kFlutterSemanticsActionTap
void(* FlutterKeyEventCallback)(bool, void *)
@ kFlutterPointerDeviceKindTrackpad
@ kFlutterPointerDeviceKindMouse
void(* OnPreEngineRestartCallback)(void *)
g_autoptr(FlEngine) engine
FlRenderable * renderable
G_MODULE_EXPORT void fl_dart_project_set_enable_impeller(FlDartProject *project, gboolean enable_impeller)
G_MODULE_EXPORT void fl_dart_project_set_ui_thread_policy(FlDartProject *project, FlUIThreadPolicy policy)
G_MODULE_EXPORT void fl_dart_project_set_dart_entrypoint_arguments(FlDartProject *self, char **argv)
@ FL_UI_THREAD_POLICY_RUN_ON_PLATFORM_THREAD
@ FL_UI_THREAD_POLICY_RUN_ON_SEPARATE_THREAD
@ FL_UI_THREAD_POLICY_DEFAULT
FlTaskRunner * fl_engine_get_task_runner(FlEngine *self)
void fl_engine_send_mouse_pointer_event(FlEngine *self, FlutterViewId view_id, FlutterPointerPhase phase, size_t timestamp, double x, double y, FlutterPointerDeviceKind device_kind, double scroll_delta_x, double scroll_delta_y, int64_t buttons, double rotation, double pressure)
gboolean fl_engine_send_key_event_finish(FlEngine *self, GAsyncResult *result, gboolean *handled, GError **error)
void fl_engine_dispatch_semantics_action(FlEngine *self, FlutterViewId view_id, uint64_t node_id, FlutterSemanticsAction action, GBytes *data)
void fl_engine_send_window_metrics_event(FlEngine *self, FlutterEngineDisplayId display_id, FlutterViewId view_id, size_t min_width, size_t min_height, size_t max_width, size_t max_height, double pixel_ratio)
void fl_engine_notify_display_update(FlEngine *self, const FlutterEngineDisplay *displays, size_t displays_length)
FlMouseCursorHandler * fl_engine_get_mouse_cursor_handler(FlEngine *self)
gboolean fl_engine_remove_view_finish(FlEngine *self, GAsyncResult *result, GError **error)
FlDisplayMonitor * fl_engine_get_display_monitor(FlEngine *self)
gboolean fl_engine_send_platform_message_response(FlEngine *self, const FlutterPlatformMessageResponseHandle *handle, GBytes *response, GError **error)
FlutterViewId fl_engine_add_view(FlEngine *self, FlRenderable *renderable, size_t min_width, size_t min_height, size_t max_width, size_t max_height, double pixel_ratio, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
void fl_engine_send_platform_message(FlEngine *self, const gchar *channel, GBytes *message, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
FlEngine * fl_engine_for_id(int64_t id)
void fl_engine_remove_view(FlEngine *self, FlutterViewId view_id, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
gboolean fl_engine_add_view_finish(FlEngine *self, GAsyncResult *result, GError **error)
void fl_engine_send_key_event(FlEngine *self, const FlutterKeyEvent *event, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
void fl_engine_send_pointer_pan_zoom_event(FlEngine *self, FlutterViewId view_id, size_t timestamp, double x, double y, FlutterPointerPhase phase, double pan_x, double pan_y, double scale, double rotation)
FlutterEngineProcTable * fl_engine_get_embedder_api(FlEngine *self)
FlKeyboardManager * fl_engine_get_keyboard_manager(FlEngine *self)
G_MODULE_EXPORT FlBinaryMessenger * fl_engine_get_binary_messenger(FlEngine *self)
gboolean fl_engine_start(FlEngine *self, GError **error)
void on_pre_engine_restart_cb(FlEngine *engine, gpointer user_data)
static void remove_view_engine_error_cb(GObject *object, GAsyncResult *result, gpointer user_data)
static void remove_view_cb(GObject *object, GAsyncResult *result, gpointer user_data)
static void add_view_error_cb(GObject *object, GAsyncResult *result, gpointer user_data)
static void add_view_engine_error_cb(GObject *object, GAsyncResult *result, gpointer user_data)
static void remove_view_error_cb(GObject *object, GAsyncResult *result, gpointer user_data)
static void add_view_cb(GObject *object, GAsyncResult *result, gpointer user_data)
TEST_F(FlEngineTest, NotifyDisplayUpdate)
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
G_MODULE_EXPORT FlJsonMessageCodec * fl_json_message_codec_new()
G_MODULE_EXPORT FlValue * fl_message_codec_decode_message(FlMessageCodec *self, GBytes *message, GError **error)
const uint8_t uint32_t uint32_t GError ** error
G_MODULE_EXPORT FlValue * fl_value_lookup_string(FlValue *self, const gchar *key)
G_MODULE_EXPORT FlValueType fl_value_get_type(FlValue *self)
typedefG_BEGIN_DECLS struct _FlValue FlValue
G_BEGIN_DECLS FlutterViewId view_id
FlutterDesktopBinaryReply callback
#define MOCK_ENGINE_PROC(proc, mock_impl)
impeller::ShaderType type
FlutterAddViewCallback add_view_callback
const FlutterWindowMetricsEvent * view_metrics
void * user_data
The |FlutterAddViewInfo.user_data|.
bool added
True if the add view operation succeeded.
size_t struct_size
The size of this struct. Must be sizeof(FlutterEngineDisplay).
FlutterEngineUpdateLocalesFnPtr UpdateLocales
FlutterEngineAddViewFnPtr AddView
FlutterEngineRemoveViewFnPtr RemoveView
FlutterEngineSendKeyEventFnPtr SendKeyEvent
FlutterEngineSendWindowMetricsEventFnPtr SendWindowMetricsEvent
FlutterEngineSendPointerEventFnPtr SendPointerEvent
FlutterEngineInitializeFnPtr Initialize
FlutterEngineNotifyDisplayUpdateFnPtr NotifyDisplayUpdate
FlutterEngineSendPlatformMessageFnPtr SendPlatformMessage
FlutterEngineRunInitializedFnPtr RunInitialized
FlutterEngineSendPlatformMessageResponseFnPtr SendPlatformMessageResponse
FlutterEngineSendSemanticsActionFnPtr SendSemanticsAction
size_t struct_size
The size of this struct. Must be sizeof(FlutterKeyEvent).
FlutterKeyEventDeviceType device_type
The source device for the key event.
FlutterKeyEventType type
The event kind.
FlutterRemoveViewCallback remove_view_callback
void * user_data
The |FlutterRemoveViewInfo.user_data|.
bool removed
True if the remove view operation succeeded.
FlutterViewId view_id
The ID of the view that includes the node.
FlutterSemanticsAction action
The semantics action.
size_t data_length
The data length.
uint64_t node_id
The semantics node identifier.
const uint8_t * data
Data associated with the action.
FlutterEngineDisplayId display_id
The identifier of the display the view is rendering on.
size_t height
Physical height of the window.
size_t min_height_constraint
size_t min_width_constraint
int64_t view_id
The view that this event is describing.
double pixel_ratio
Scale factor for the physical screen.
size_t max_width_constraint
size_t max_height_constraint
size_t width
Physical width of the window.