24#include "gmock/gmock.h"
25#include "gtest/gtest.h"
34class HalfBrokenEGLManager :
public egl::Manager {
38 std::unique_ptr<egl::WindowSurface>
39 CreateWindowSurface(HWND hwnd,
size_t width,
size_t height)
override {
44class MockWindowsLifecycleManager :
public WindowsLifecycleManager {
57 ::TranslateMessage(&msg);
66TEST(WindowsNoFixtureTest, GetTextureRegistrar) {
71 ASSERT_NE(
engine,
nullptr);
79 auto& context = GetContext();
82 ASSERT_NE(controller,
nullptr);
91 auto& context = GetContext();
94 ASSERT_NE(controller,
nullptr);
96 stderr_capture.
Stop();
99 EXPECT_TRUE(stderr_capture.
GetOutput().empty());
104 auto& context = GetContext();
108 ASSERT_NE(controller,
nullptr);
117 auto& context = GetContext();
120 ASSERT_NE(
engine,
nullptr);
127 auto& context = GetContext();
131 ASSERT_NE(
engine,
nullptr);
133 std::string view_ids;
134 bool signaled =
false;
135 context.AddNativeFunction(
137 auto handle = Dart_GetNativeArgument(
args, 0);
138 ASSERT_FALSE(Dart_IsError(handle));
144 ASSERT_NE(controller,
nullptr);
151 EXPECT_EQ(view_ids,
"View IDs: [0]");
156 auto& context = GetContext();
159 ASSERT_NE(
engine,
nullptr);
168 ASSERT_NE(controller,
nullptr);
172 ASSERT_NE(
engine,
nullptr);
175 ASSERT_TRUE(engine_ptr->running());
180 auto& context = GetContext();
188 UpdateAccessibilityFeatures, ([&called](
auto engine,
auto flags) {
205 auto& context = GetContext();
209 ASSERT_NE(
engine,
nullptr);
216 auto& context = GetContext();
220 bool signaled =
false;
223 context.AddNativeFunction(
"Signal", native_entry);
226 ASSERT_NE(controller,
nullptr);
237 auto& context = GetContext();
241 bool bool_value =
false;
242 bool signaled =
false;
244 auto handle = Dart_GetNativeBooleanArgument(
args, 0, &bool_value);
245 ASSERT_FALSE(Dart_IsError(handle));
248 context.AddNativeFunction(
"SignalBoolValue", native_entry);
251 ASSERT_NE(controller,
nullptr);
257 EXPECT_TRUE(bool_value);
262 auto& context = GetContext();
266 std::string executable_name;
267 bool signaled =
false;
269 auto handle = Dart_GetNativeArgument(
args, 0);
270 ASSERT_FALSE(Dart_IsError(handle));
274 context.AddNativeFunction(
"SignalStringValue", native_entry);
277 ASSERT_NE(controller,
nullptr);
283 EXPECT_EQ(executable_name,
"flutter_windows_unittests.exe");
289 auto& context = GetContext();
293 bool bool_value_to_return =
true;
296 Dart_SetBooleanReturnValue(
args, bool_value_to_return);
299 context.AddNativeFunction(
"SignalBoolReturn", bool_return_entry);
301 bool bool_value_passed =
false;
303 auto handle = Dart_GetNativeBooleanArgument(
args, 0, &bool_value_passed);
304 ASSERT_FALSE(Dart_IsError(handle));
307 context.AddNativeFunction(
"SignalBoolValue", bool_pass_entry);
310 ASSERT_NE(controller,
nullptr);
316 EXPECT_TRUE(bool_value_passed);
323 std::thread::id thread_id;
328 auto platform_thread = std::make_unique<fml::Thread>(
"test_platform_thread");
329 platform_thread->GetTaskRunner()->PostTask([&]() {
330 captures.thread_id = std::this_thread::get_id();
332 auto& context = GetContext();
337 captures.frame_scheduled_latch.Signal();
339 context.AddNativeFunction(
"NotifyFirstFrameScheduled", native_entry);
342 EXPECT_NE(controller,
nullptr);
349 auto captures =
static_cast<Captures*
>(
user_data);
351 EXPECT_TRUE(captures->frame_scheduled_latch.IsSignaledForTest());
354 EXPECT_EQ(std::this_thread::get_id(), captures->thread_id);
357 captures->done =
true;
362 while (!captures.done) {
368 platform_thread->Join();
374 auto& context = GetContext();
379 ASSERT_NE(
engine,
nullptr);
386 auto done = reinterpret_cast<std::atomic<bool>*>(user_data);
401 engine_ptr->SendWindowMetricsEvent(metrics);
411 auto& context = GetContext();
414 ASSERT_NE(controller,
nullptr);
422 auto& context = GetContext();
425 ASSERT_NE(controller,
nullptr);
428 Microsoft::WRL::ComPtr<IDXGIAdapter> dxgi_adapter;
430 ASSERT_NE(dxgi_adapter,
nullptr);
431 DXGI_ADAPTER_DESC desc{};
432 ASSERT_TRUE(
SUCCEEDED(dxgi_adapter->GetDesc(&desc)));
436 auto& context = GetContext();
439 ASSERT_NE(controller,
nullptr);
443 IDXGIAdapter* dxgi_adapter;
445 ASSERT_NE(dxgi_adapter,
nullptr);
446 DXGI_ADAPTER_DESC desc{};
447 ASSERT_TRUE(
SUCCEEDED(dxgi_adapter->GetDesc(&desc)));
453 GTEST_SKIP() <<
"Not able to find low power GPU, nothing to check.";
456 auto& context = GetContext();
460 ASSERT_NE(controller,
nullptr);
463 Microsoft::WRL::ComPtr<IDXGIAdapter> dxgi_adapter;
465 ASSERT_NE(dxgi_adapter,
nullptr);
466 DXGI_ADAPTER_DESC desc{};
467 ASSERT_TRUE(
SUCCEEDED(dxgi_adapter->GetDesc(&desc)));
468 ASSERT_EQ(desc.AdapterLuid.HighPart, luid->HighPart);
469 ASSERT_EQ(desc.AdapterLuid.LowPart, luid->LowPart);
475 GTEST_SKIP() <<
"Not able to find high performance GPU, nothing to check.";
478 auto& context = GetContext();
483 ASSERT_NE(controller,
nullptr);
486 Microsoft::WRL::ComPtr<IDXGIAdapter> dxgi_adapter;
488 ASSERT_NE(dxgi_adapter,
nullptr);
489 DXGI_ADAPTER_DESC desc{};
490 ASSERT_TRUE(
SUCCEEDED(dxgi_adapter->GetDesc(&desc)));
491 ASSERT_EQ(desc.AdapterLuid.HighPart, luid->HighPart);
492 ASSERT_EQ(desc.AdapterLuid.LowPart, luid->LowPart);
498 GTEST_SKIP() <<
"Not able to find low power GPU, nothing to check.";
501 auto& context = GetContext();
505 ASSERT_NE(controller,
nullptr);
509 IDXGIAdapter* dxgi_adapter;
511 ASSERT_NE(dxgi_adapter,
nullptr);
512 DXGI_ADAPTER_DESC desc{};
513 ASSERT_TRUE(
SUCCEEDED(dxgi_adapter->GetDesc(&desc)));
514 ASSERT_EQ(desc.AdapterLuid.HighPart, luid->HighPart);
515 ASSERT_EQ(desc.AdapterLuid.LowPart, luid->LowPart);
521 GTEST_SKIP() <<
"Not able to find high performance GPU, nothing to check.";
524 auto& context = GetContext();
529 ASSERT_NE(controller,
nullptr);
533 IDXGIAdapter* dxgi_adapter;
535 ASSERT_NE(dxgi_adapter,
nullptr);
536 DXGI_ADAPTER_DESC desc{};
537 ASSERT_TRUE(
SUCCEEDED(dxgi_adapter->GetDesc(&desc)));
538 ASSERT_EQ(desc.AdapterLuid.HighPart, luid->HighPart);
539 ASSERT_EQ(desc.AdapterLuid.LowPart, luid->LowPart);
544 auto& context = GetContext();
547 ASSERT_NE(controller,
nullptr);
556 ASSERT_NE(implicit_view,
nullptr);
560 auto& context = GetContext();
563 ASSERT_NE(controller,
nullptr);
578 ASSERT_NE(
view,
nullptr);
579 ASSERT_EQ(view_123,
nullptr);
583 auto& context = GetContext();
586 ASSERT_NE(
engine,
nullptr);
596 ASSERT_EQ(implicit_view,
nullptr);
597 ASSERT_EQ(view_123,
nullptr);
603 auto& context = GetContext();
609 auto egl_manager = std::make_unique<HalfBrokenEGLManager>();
610 ASSERT_TRUE(egl_manager->IsValid());
611 modifier.SetEGLManager(std::move(egl_manager));
616 ASSERT_NE(controller,
nullptr);
621 auto& context = GetContext();
627 auto lifecycle_manager =
628 std::make_unique<MockWindowsLifecycleManager>(windows_engine);
629 auto lifecycle_manager_ptr = lifecycle_manager.get();
630 modifier.SetLifecycleManager(std::move(lifecycle_manager));
632 EXPECT_CALL(*lifecycle_manager_ptr,
635 lifecycle_manager_ptr->WindowsLifecycleManager::SetLifecycleState(
639 EXPECT_CALL(*lifecycle_manager_ptr,
642 lifecycle_manager_ptr->WindowsLifecycleManager::SetLifecycleState(
655 ASSERT_NE(
view,
nullptr);
658 ASSERT_NE(hwnd,
nullptr);
663 ::MoveWindow(hwnd, 0, 0, 100, 100,
666 while (lifecycle_manager_ptr->IsUpdateStateScheduled()) {
673 while (lifecycle_manager_ptr->IsUpdateStateScheduled()) {
679 auto& context = GetContext();
683 std::atomic<bool> done =
false;
684 context.AddNativeFunction(
686 auto handle = Dart_GetNativeArgument(
args, 0);
687 ASSERT_FALSE(Dart_IsError(handle));
689 EXPECT_EQ(
value,
"Success");
694 ASSERT_NE(controller,
nullptr);
706 std::string view_ids;
708 auto& context = GetContext();
713 context.AddNativeFunction(
717 context.AddNativeFunction(
719 auto handle = Dart_GetNativeArgument(
args, 0);
720 ASSERT_FALSE(Dart_IsError(handle));
722 std::scoped_lock lock{mutex};
728 ASSERT_NE(first_controller,
nullptr);
738 properties.
width = 100;
742 ASSERT_NE(second_controller,
nullptr);
747 std::scoped_lock lock{mutex};
748 if (view_ids ==
"View IDs: [0, 1]") {
755 second_controller.reset();
758 std::scoped_lock lock{mutex};
759 if (view_ids ==
"View IDs: [0]") {
766 auto& context = GetContext();
770 std::optional<int64_t> engineId;
771 context.AddNativeFunction(
773 const auto argument = Dart_GetNativeArgument(
args, 0);
774 if (!Dart_IsNull(argument)) {
781 ASSERT_NE(first_controller,
nullptr);
783 while (!engineId.has_value()) {
792 auto& context = GetContext();
802 context.AddNativeFunction(
"Signal", native_entry);
806 ASSERT_NE(controller,
nullptr);
809 ASSERT_NE(
view,
nullptr);
821 ASSERT_NE(hwnd,
nullptr);
829 HRESULT hr = ObjectFromLresult(lres, IID_IAccessible, 0, (
void**)&
accessible);
834 hr = ObjectFromLresult(lres, IID_IAccessibleEx, 0, (
void**)&accessible_ex);
836 ASSERT_EQ(accessible_ex,
nullptr);
840 auto& context = GetContext();
850 context.AddNativeFunction(
"Signal", native_entry);
854 ASSERT_NE(controller,
nullptr);
857 ASSERT_NE(
view,
nullptr);
869 ASSERT_NE(hwnd,
nullptr);
878 ObjectFromLresult(lres, IID_IAccessibleEx, 0, (
void**)&accessible_ex);
880 ASSERT_NE(accessible_ex,
nullptr);
881 accessible_ex->Release();
void UpdateAccessibilityFeatures()
virtual void OnUpdateSemanticsEnabled(bool enabled) override
WindowsLifecycleManager(FlutterWindowsEngine *engine)
virtual void SetLifecycleState(AppLifecycleState state)
static std::optional< LUID > GetLowPowerGpuLuid()
static std::optional< LUID > GetHighPerformanceGpuLuid()
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 SetAccessibilityMode(FlutterDesktopAccessibilityMode accessibility_mode)
void SetDartEntrypoint(std::string_view entrypoint)
EnginePtr RunHeadless() const
void SetGpuPreference(FlutterDesktopGpuPreference gpu_preference)
ViewControllerPtr Run() const
FlViewAccessible * accessible
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
@ HighPerformancePreference
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)
bool FlutterDesktopEngineGetGraphicsAdapter(FlutterDesktopEngineRef engine, IDXGIAdapter **adapter_out)
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)