10#include "gmock/gmock.h"
11#include "gtest/gtest.h"
17using ::testing::Return;
20class TestWindowsApi :
public testing::StubFlutterWindowsApi {
22 void PluginRegistrarRegisterTopLevelWindowProcDelegate(
25 ++registered_delegate_count_;
26 last_registered_delegate_ = delegate;
32 PluginRegistrarGetViewById,
36 void PluginRegistrarUnregisterTopLevelWindowProcDelegate(
38 --registered_delegate_count_;
41 int registered_delegate_count() {
return registered_delegate_count_; }
44 return last_registered_delegate_;
47 void* last_registered_user_data() {
return last_registered_user_data_; }
49 bool PluginRegistrarGetGraphicsAdapter(IDXGIAdapter** adapter_out)
override {
50 *adapter_out =
reinterpret_cast<IDXGIAdapter*
>(10);
55 int registered_delegate_count_ = 0;
57 void* last_registered_user_data_ =
nullptr;
62class TestPlugin :
public Plugin {
66 TestPlugin(PluginRegistrarWindows* registrar,
67 bool* registrar_valid_at_destruction)
68 : registrar_(registrar),
69 registrar_valid_at_destruction_(registrar_valid_at_destruction) {}
70 virtual ~TestPlugin() {
71 *registrar_valid_at_destruction_ = registrar_->GetView() !=
nullptr;
75 PluginRegistrarWindows* registrar_;
76 bool* registrar_valid_at_destruction_;
81TEST(PluginRegistrarWindowsTest, GetView) {
82 auto windows_api = std::make_unique<TestWindowsApi>();
83 EXPECT_CALL(*windows_api, PluginRegistrarGetView)
87 auto test_api =
static_cast<TestWindowsApi*
>(scoped_api_stub.
stub());
91 EXPECT_NE(registrar.
GetView(),
nullptr);
94TEST(PluginRegistrarWindowsTest, GetViewById) {
95 auto windows_api = std::make_unique<TestWindowsApi>();
96 EXPECT_CALL(*windows_api, PluginRegistrarGetView)
97 .WillRepeatedly(Return(
nullptr));
98 EXPECT_CALL(*windows_api, PluginRegistrarGetViewById(123))
100 EXPECT_CALL(*windows_api, PluginRegistrarGetViewById(456))
101 .WillOnce(Return(
nullptr));
104 auto test_api =
static_cast<TestWindowsApi*
>(scoped_api_stub.
stub());
108 EXPECT_EQ(registrar.
GetView(),
nullptr);
109 EXPECT_NE(registrar.
GetViewById(123).get(),
nullptr);
110 EXPECT_EQ(registrar.
GetViewById(456).get(),
nullptr);
113TEST(PluginRegistrarWindowsTest, GetGraphicsAdapter) {
114 auto windows_api = std::make_unique<TestWindowsApi>();
115 EXPECT_CALL(*windows_api, PluginRegistrarGetView)
116 .WillRepeatedly(Return(
nullptr));
118 auto test_api =
static_cast<TestWindowsApi*
>(scoped_api_stub.
stub());
121 IDXGIAdapter* adapter =
nullptr;
123 EXPECT_EQ(adapter,
reinterpret_cast<IDXGIAdapter*
>(10));
127TEST(PluginRegistrarWindowsTest, PluginDestroyedBeforeRegistrar) {
128 auto windows_api = std::make_unique<TestWindowsApi>();
129 EXPECT_CALL(*windows_api, PluginRegistrarGetView)
132 auto test_api =
static_cast<TestWindowsApi*
>(scoped_api_stub.
stub());
136 auto dummy_registrar_handle =
138 bool registrar_valid_at_destruction =
false;
142 auto plugin = std::make_unique<TestPlugin>(®istrar,
143 ®istrar_valid_at_destruction);
146 EXPECT_TRUE(registrar_valid_at_destruction);
149TEST(PluginRegistrarWindowsTest, RegisterUnregister) {
150 auto windows_api = std::make_unique<TestWindowsApi>();
151 EXPECT_CALL(*windows_api, PluginRegistrarGetView).WillOnce(Return(
nullptr));
153 auto test_api =
static_cast<TestWindowsApi*
>(scoped_api_stub.
stub());
159 return std::optional<LRESULT>();
162 EXPECT_EQ(test_api->registered_delegate_count(), 1);
166 EXPECT_EQ(test_api->registered_delegate_count(), 1);
171 EXPECT_EQ(test_api->registered_delegate_count(), 1);
174 EXPECT_EQ(test_api->registered_delegate_count(), 0);
176 EXPECT_NE(id_a, id_b);
179TEST(PluginRegistrarWindowsTest, CallsRegisteredDelegates) {
180 auto windows_api = std::make_unique<TestWindowsApi>();
181 EXPECT_CALL(*windows_api, PluginRegistrarGetView).WillOnce(Return(
nullptr));
183 auto test_api =
static_cast<TestWindowsApi*
>(scoped_api_stub.
stub());
188 bool called_a =
false;
193 EXPECT_EQ(hwnd, dummy_hwnd);
195 EXPECT_EQ(wparam, 3);
196 EXPECT_EQ(lparam, 4);
197 return std::optional<LRESULT>();
199 bool called_b =
false;
203 return std::optional<LRESULT>();
209 bool handled = test_api->last_registered_delegate()(
210 dummy_hwnd, 2, 3, 4, test_api->last_registered_user_data(), &result);
211 EXPECT_TRUE(called_a);
212 EXPECT_TRUE(called_b);
213 EXPECT_FALSE(handled);
216TEST(PluginRegistrarWindowsTest, StopsOnceHandled) {
217 auto windows_api = std::make_unique<TestWindowsApi>();
218 EXPECT_CALL(*windows_api, PluginRegistrarGetView).WillOnce(Return(
nullptr));
220 auto test_api =
static_cast<TestWindowsApi*
>(scoped_api_stub.
stub());
224 bool called_a =
false;
228 return std::optional<LRESULT>(7);
230 bool called_b =
false;
234 return std::optional<LRESULT>(7);
241 bool handled = test_api->last_registered_delegate()(
242 dummy_hwnd, 2, 3, 4, test_api->last_registered_user_data(), &result);
245 EXPECT_TRUE(called_a || called_b);
246 EXPECT_NE(called_a, called_b);
248 EXPECT_TRUE(handled);
249 EXPECT_EQ(result, 7);
void AddPlugin(std::unique_ptr< Plugin > plugin)
bool GetGraphicsAdapter(IDXGIAdapter **adapter_out)
int RegisterTopLevelWindowProcDelegate(WindowProcDelegate delegate)
std::shared_ptr< FlutterView > GetViewById(FlutterViewId view_id) const
void UnregisterTopLevelWindowProcDelegate(int proc_id)
StubFlutterWindowsApi * stub()
bool(* FlutterDesktopWindowProcCallback)(HWND, UINT, WPARAM, LPARAM, void *, LRESULT *result)
int64_t FlutterDesktopViewId
struct FlutterDesktopView * FlutterDesktopViewRef
TEST(FrameTimingsRecorderTest, RecordVsync)
std::function< std::optional< LRESULT >(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)> WindowProcDelegate