22#include "gmock/gmock.h"
23#include "gtest/gtest.h"
32class HalfBrokenEGLManager :
public egl::Manager {
36 std::unique_ptr<egl::WindowSurface>
37 CreateWindowSurface(HWND hwnd,
size_t width,
size_t height)
override {
42class MockWindowsLifecycleManager :
public WindowsLifecycleManager {
55 ::TranslateMessage(&msg);
64TEST(WindowsNoFixtureTest, GetTextureRegistrar) {
69 ASSERT_NE(
engine,
nullptr);
77 auto& context = GetContext();
80 ASSERT_NE(controller,
nullptr);
89 auto& context = GetContext();
92 ASSERT_NE(controller,
nullptr);
94 stderr_capture.
Stop();
97 EXPECT_TRUE(stderr_capture.
GetOutput().empty());
102 auto& context = GetContext();
106 ASSERT_NE(controller,
nullptr);
115 auto& context = GetContext();
118 ASSERT_NE(
engine,
nullptr);
125 auto& context = GetContext();
129 ASSERT_NE(
engine,
nullptr);
131 std::string view_ids;
132 bool signaled =
false;
133 context.AddNativeFunction(
135 auto handle = Dart_GetNativeArgument(
args, 0);
136 ASSERT_FALSE(Dart_IsError(handle));
142 ASSERT_NE(controller,
nullptr);
149 EXPECT_EQ(view_ids,
"View IDs: [0]");
154 auto& context = GetContext();
157 ASSERT_NE(
engine,
nullptr);
166 ASSERT_NE(controller,
nullptr);
170 ASSERT_NE(
engine,
nullptr);
173 ASSERT_TRUE(engine_ptr->running());
178 auto& context = GetContext();
186 UpdateAccessibilityFeatures, ([&called](
auto engine,
auto flags) {
203 auto& context = GetContext();
207 ASSERT_NE(
engine,
nullptr);
214 auto& context = GetContext();
218 bool signaled =
false;
221 context.AddNativeFunction(
"Signal", native_entry);
224 ASSERT_NE(controller,
nullptr);
235 auto& context = GetContext();
239 bool bool_value =
false;
240 bool signaled =
false;
242 auto handle = Dart_GetNativeBooleanArgument(
args, 0, &bool_value);
243 ASSERT_FALSE(Dart_IsError(handle));
246 context.AddNativeFunction(
"SignalBoolValue", native_entry);
249 ASSERT_NE(controller,
nullptr);
255 EXPECT_TRUE(bool_value);
260 auto& context = GetContext();
264 std::string executable_name;
265 bool signaled =
false;
267 auto handle = Dart_GetNativeArgument(
args, 0);
268 ASSERT_FALSE(Dart_IsError(handle));
272 context.AddNativeFunction(
"SignalStringValue", native_entry);
275 ASSERT_NE(controller,
nullptr);
281 EXPECT_EQ(executable_name,
"flutter_windows_unittests.exe");
287 auto& context = GetContext();
291 bool bool_value_to_return =
true;
294 Dart_SetBooleanReturnValue(
args, bool_value_to_return);
297 context.AddNativeFunction(
"SignalBoolReturn", bool_return_entry);
299 bool bool_value_passed =
false;
301 auto handle = Dart_GetNativeBooleanArgument(
args, 0, &bool_value_passed);
302 ASSERT_FALSE(Dart_IsError(handle));
305 context.AddNativeFunction(
"SignalBoolValue", bool_pass_entry);
308 ASSERT_NE(controller,
nullptr);
314 EXPECT_TRUE(bool_value_passed);
321 std::thread::id thread_id;
326 auto platform_thread = std::make_unique<fml::Thread>(
"test_platform_thread");
327 platform_thread->GetTaskRunner()->PostTask([&]() {
328 captures.thread_id = std::this_thread::get_id();
330 auto& context = GetContext();
335 captures.frame_scheduled_latch.Signal();
337 context.AddNativeFunction(
"NotifyFirstFrameScheduled", native_entry);
340 EXPECT_NE(controller,
nullptr);
347 auto captures =
static_cast<Captures*
>(
user_data);
349 EXPECT_TRUE(captures->frame_scheduled_latch.IsSignaledForTest());
352 EXPECT_EQ(std::this_thread::get_id(), captures->thread_id);
355 captures->done =
true;
360 while (!captures.done) {
366 platform_thread->Join();
372 auto& context = GetContext();
377 ASSERT_NE(
engine,
nullptr);
384 auto done = reinterpret_cast<std::atomic<bool>*>(user_data);
399 engine_ptr->SendWindowMetricsEvent(metrics);
409 auto& context = GetContext();
412 ASSERT_NE(controller,
nullptr);
420 auto& context = GetContext();
423 ASSERT_NE(controller,
nullptr);
426 Microsoft::WRL::ComPtr<IDXGIAdapter> dxgi_adapter;
428 ASSERT_NE(dxgi_adapter,
nullptr);
429 DXGI_ADAPTER_DESC desc{};
430 ASSERT_TRUE(
SUCCEEDED(dxgi_adapter->GetDesc(&desc)));
436 GTEST_SKIP() <<
"Not able to find low power GPU, nothing to check.";
439 auto& context = GetContext();
443 ASSERT_NE(controller,
nullptr);
446 Microsoft::WRL::ComPtr<IDXGIAdapter> dxgi_adapter;
448 ASSERT_NE(dxgi_adapter,
nullptr);
449 DXGI_ADAPTER_DESC desc{};
450 ASSERT_TRUE(
SUCCEEDED(dxgi_adapter->GetDesc(&desc)));
451 ASSERT_EQ(desc.AdapterLuid.HighPart, luid->HighPart);
452 ASSERT_EQ(desc.AdapterLuid.LowPart, luid->LowPart);
457 auto& context = GetContext();
460 ASSERT_NE(controller,
nullptr);
469 ASSERT_NE(implicit_view,
nullptr);
473 auto& context = GetContext();
476 ASSERT_NE(controller,
nullptr);
491 ASSERT_NE(
view,
nullptr);
492 ASSERT_EQ(view_123,
nullptr);
496 auto& context = GetContext();
499 ASSERT_NE(
engine,
nullptr);
509 ASSERT_EQ(implicit_view,
nullptr);
510 ASSERT_EQ(view_123,
nullptr);
516 auto& context = GetContext();
522 auto egl_manager = std::make_unique<HalfBrokenEGLManager>();
523 ASSERT_TRUE(egl_manager->IsValid());
524 modifier.SetEGLManager(std::move(egl_manager));
529 ASSERT_NE(controller,
nullptr);
534 auto& context = GetContext();
540 auto lifecycle_manager =
541 std::make_unique<MockWindowsLifecycleManager>(windows_engine);
542 auto lifecycle_manager_ptr = lifecycle_manager.get();
543 modifier.SetLifecycleManager(std::move(lifecycle_manager));
545 EXPECT_CALL(*lifecycle_manager_ptr,
548 lifecycle_manager_ptr->WindowsLifecycleManager::SetLifecycleState(
552 EXPECT_CALL(*lifecycle_manager_ptr,
555 lifecycle_manager_ptr->WindowsLifecycleManager::SetLifecycleState(
568 ASSERT_NE(
view,
nullptr);
571 ASSERT_NE(hwnd,
nullptr);
576 ::MoveWindow(hwnd, 0, 0, 100, 100,
579 while (lifecycle_manager_ptr->IsUpdateStateScheduled()) {
586 while (lifecycle_manager_ptr->IsUpdateStateScheduled()) {
592 auto& context = GetContext();
596 std::atomic<bool> done =
false;
597 context.AddNativeFunction(
599 auto handle = Dart_GetNativeArgument(
args, 0);
600 ASSERT_FALSE(Dart_IsError(handle));
602 EXPECT_EQ(
value,
"Success");
607 ASSERT_NE(controller,
nullptr);
619 std::string view_ids;
621 auto& context = GetContext();
626 context.AddNativeFunction(
630 context.AddNativeFunction(
632 auto handle = Dart_GetNativeArgument(
args, 0);
633 ASSERT_FALSE(Dart_IsError(handle));
635 std::scoped_lock lock{mutex};
641 ASSERT_NE(first_controller,
nullptr);
651 properties.
width = 100;
655 ASSERT_NE(second_controller,
nullptr);
660 std::scoped_lock lock{mutex};
661 if (view_ids ==
"View IDs: [0, 1]") {
668 second_controller.reset();
671 std::scoped_lock lock{mutex};
672 if (view_ids ==
"View IDs: [0]") {
679 auto& context = GetContext();
683 std::optional<int64_t> engineId;
684 context.AddNativeFunction(
686 const auto argument = Dart_GetNativeArgument(
args, 0);
687 if (!Dart_IsNull(argument)) {
694 ASSERT_NE(first_controller,
nullptr);
696 while (!engineId.has_value()) {
void UpdateAccessibilityFeatures()
WindowsLifecycleManager(FlutterWindowsEngine *engine)
virtual void SetLifecycleState(AppLifecycleState state)
static std::optional< LUID > GetLowPowerGpuLuid()
MOCK_METHOD(void, Quit,(std::optional< HWND >, std::optional< WPARAM >, std::optional< LPARAM >, UINT),(override))
MockWindowsLifecycleManager(FlutterWindowsEngine *engine)
std::string GetOutput() const
EnginePtr InitializeEngine() const
void SetDartEntrypoint(std::string_view entrypoint)
EnginePtr RunHeadless() const
void SetGpuPreference(FlutterDesktopGpuPreference gpu_preference)
ViewControllerPtr Run() const
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
G_BEGIN_DECLS FlutterViewId view_id
FLUTTER_EXPORT FlutterDesktopEngineRef FlutterDesktopEngineForId(int64_t engine_id)
FlutterDesktopViewControllerRef FlutterDesktopEngineCreateViewController(FlutterDesktopEngineRef engine, const FlutterDesktopViewControllerProperties *properties)
int64_t FlutterDesktopViewId
struct FlutterDesktopView * FlutterDesktopViewRef
G_BEGIN_DECLS FlTextureRegistrar * texture_registrar
TEST_F(DisplayListTest, Defaults)
std::unique_ptr< FlutterDesktopEngine, EngineDeleter > EnginePtr
std::unique_ptr< FlutterDesktopViewController, ViewControllerDeleter > ViewControllerPtr
TEST(NativeAssetsManagerTest, NoAvailableAssets)
constexpr int64_t kImplicitViewId
#define MOCK_ENGINE_PROC(proc, mock_impl)
const char * icu_data_path
size_t struct_size
The size of this struct. Must be sizeof(FlutterWindowMetricsEvent).
size_t height
Physical height of the window.
int64_t view_id
The view that this event is describing.
double pixel_ratio
Scale factor for the physical screen.
size_t width
Physical width of the window.
HWND FlutterDesktopViewGetHWND(FlutterDesktopViewRef controller)
FlutterDesktopEngineRef FlutterDesktopEngineCreate(const FlutterDesktopEngineProperties *engine_properties)
FlutterDesktopViewId FlutterDesktopViewControllerGetViewId(FlutterDesktopViewControllerRef controller)
FlutterDesktopPluginRegistrarRef FlutterDesktopEngineGetPluginRegistrar(FlutterDesktopEngineRef engine, const char *plugin_name)
FlutterDesktopViewControllerRef FlutterDesktopViewControllerCreate(int width, int height, FlutterDesktopEngineRef engine)
bool FlutterDesktopEngineDestroy(FlutterDesktopEngineRef engine_ref)
FlutterDesktopEngineRef FlutterDesktopViewControllerGetEngine(FlutterDesktopViewControllerRef controller)
FlutterDesktopViewRef FlutterDesktopViewControllerGetView(FlutterDesktopViewControllerRef controller)
FlutterDesktopTextureRegistrarRef FlutterDesktopEngineGetTextureRegistrar(FlutterDesktopEngineRef engine)
FlutterDesktopViewRef FlutterDesktopPluginRegistrarGetView(FlutterDesktopPluginRegistrarRef controller)
IDXGIAdapter * FlutterDesktopViewGetGraphicsAdapter(FlutterDesktopViewRef view)
void FlutterDesktopEngineSetNextFrameCallback(FlutterDesktopEngineRef engine, VoidCallback callback, void *user_data)
FlutterDesktopViewRef FlutterDesktopPluginRegistrarGetViewById(FlutterDesktopPluginRegistrarRef controller, FlutterDesktopViewId view_id)
bool FlutterDesktopEngineRun(FlutterDesktopEngineRef engine, const char *entry_point)
#define CREATE_NATIVE_ENTRY(native_entry)