this test is _fantastic_
This commit is contained in:
parent
c215a97d09
commit
26d5194b0c
|
@ -36,6 +36,31 @@ using namespace winrt::Microsoft::Terminal;
|
|||
|
||||
namespace RemotingUnitTests
|
||||
{
|
||||
struct MockDesktopManager : implements<MockDesktopManager, IVirtualDesktopManager>
|
||||
{
|
||||
HRESULT GetWindowDesktopId(HWND /*topLevelWindow*/, GUID* /*desktopId*/)
|
||||
{
|
||||
VERIFY_IS_TRUE(false, L"We shouldn't need GetWindowDesktopId in the tests.");
|
||||
return E_FAIL;
|
||||
}
|
||||
HRESULT MoveWindowToDesktop(HWND /*topLevelWindow*/, REFGUID /*desktopId*/)
|
||||
{
|
||||
VERIFY_IS_TRUE(false, L"We shouldn't need GetWindowDesktopId in the tests.");
|
||||
return E_FAIL;
|
||||
}
|
||||
HRESULT IsWindowOnCurrentVirtualDesktop(HWND topLevelWindow, BOOL* onCurrentDesktop)
|
||||
{
|
||||
if (pfnIsWindowOnCurrentVirtualDesktop)
|
||||
{
|
||||
return pfnIsWindowOnCurrentVirtualDesktop(topLevelWindow, onCurrentDesktop);
|
||||
}
|
||||
VERIFY_IS_TRUE(false, L"You didn't set up the pfnIsWindowOnCurrentVirtualDesktop for this test!");
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
std::function<HRESULT(HWND, BOOL*)> pfnIsWindowOnCurrentVirtualDesktop;
|
||||
};
|
||||
|
||||
// This is a silly helper struct.
|
||||
// It will always throw an hresult_error on any of its methods.
|
||||
//
|
||||
|
@ -60,13 +85,13 @@ namespace RemotingUnitTests
|
|||
Remoting::CommandlineArgs InitialArgs() { throw winrt::hresult_error{}; }
|
||||
Remoting::WindowActivatedArgs GetLastActivatedArgs() { throw winrt::hresult_error{}; }
|
||||
void RequestRename(const Remoting::RenameRequestArgs& /*args*/) { throw winrt::hresult_error{}; }
|
||||
void Summon() { throw winrt::hresult_error{}; };
|
||||
void Summon(const Remoting::SummonWindowBehavior& /*args*/) { throw winrt::hresult_error{}; };
|
||||
TYPED_EVENT(WindowActivated, winrt::Windows::Foundation::IInspectable, Remoting::WindowActivatedArgs);
|
||||
TYPED_EVENT(ExecuteCommandlineRequested, winrt::Windows::Foundation::IInspectable, Remoting::CommandlineArgs);
|
||||
TYPED_EVENT(IdentifyWindowsRequested, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable);
|
||||
TYPED_EVENT(DisplayWindowIdRequested, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable);
|
||||
TYPED_EVENT(RenameRequested, winrt::Windows::Foundation::IInspectable, Remoting::RenameRequestArgs);
|
||||
TYPED_EVENT(SummonRequested, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable);
|
||||
TYPED_EVENT(SummonRequested, winrt::Windows::Foundation::IInspectable, Remoting::SummonWindowBehavior);
|
||||
};
|
||||
|
||||
class RemotingTests
|
||||
|
@ -112,6 +137,10 @@ namespace RemotingUnitTests
|
|||
TEST_METHOD(TestSummonNamedDeadWindow);
|
||||
TEST_METHOD(TestSummonMostRecentDeadWindow);
|
||||
|
||||
TEST_METHOD(TestSummonOnCurrent);
|
||||
TEST_METHOD(TestSummonOnCurrentWithName);
|
||||
TEST_METHOD(TestSummonOnCurrentDeadWindow);
|
||||
|
||||
TEST_CLASS_SETUP(ClassSetup)
|
||||
{
|
||||
return true;
|
||||
|
@ -1841,4 +1870,274 @@ namespace RemotingUnitTests
|
|||
VERIFY_IS_TRUE(args.FoundMatch());
|
||||
}
|
||||
|
||||
void RemotingTests::TestSummonOnCurrent()
|
||||
{
|
||||
Log::Comment(L"TODO!");
|
||||
|
||||
const winrt::guid guid1{ Utils::GuidFromString(L"{11111111-1111-1111-1111-111111111111}") };
|
||||
const winrt::guid guid2{ Utils::GuidFromString(L"{22222222-2222-2222-2222-222222222222}") };
|
||||
|
||||
constexpr auto monarch0PID = 12345u;
|
||||
constexpr auto peasant1PID = 23456u;
|
||||
constexpr auto peasant2PID = 34567u;
|
||||
constexpr auto peasant3PID = 45678u;
|
||||
|
||||
com_ptr<Remoting::implementation::Monarch> m0;
|
||||
m0.attach(new Remoting::implementation::Monarch(monarch0PID));
|
||||
|
||||
com_ptr<Remoting::implementation::Peasant> p1;
|
||||
p1.attach(new Remoting::implementation::Peasant(peasant1PID));
|
||||
|
||||
com_ptr<Remoting::implementation::Peasant> p2;
|
||||
p2.attach(new Remoting::implementation::Peasant(peasant2PID));
|
||||
|
||||
com_ptr<Remoting::implementation::Peasant> p3;
|
||||
p3.attach(new Remoting::implementation::Peasant(peasant3PID));
|
||||
|
||||
VERIFY_IS_NOT_NULL(m0);
|
||||
VERIFY_IS_NOT_NULL(p1);
|
||||
VERIFY_IS_NOT_NULL(p2);
|
||||
VERIFY_IS_NOT_NULL(p3);
|
||||
p1->WindowName(L"one");
|
||||
p2->WindowName(L"two");
|
||||
p3->WindowName(L"three");
|
||||
|
||||
VERIFY_ARE_EQUAL(0, p1->GetID());
|
||||
VERIFY_ARE_EQUAL(0, p2->GetID());
|
||||
VERIFY_ARE_EQUAL(0, p3->GetID());
|
||||
|
||||
m0->AddPeasant(*p1);
|
||||
m0->AddPeasant(*p2);
|
||||
m0->AddPeasant(*p3);
|
||||
|
||||
VERIFY_ARE_EQUAL(1, p1->GetID());
|
||||
VERIFY_ARE_EQUAL(2, p2->GetID());
|
||||
VERIFY_ARE_EQUAL(3, p3->GetID());
|
||||
|
||||
VERIFY_ARE_EQUAL(3u, m0->_peasants.size());
|
||||
|
||||
bool p1ExpectedToBeSummoned = false;
|
||||
bool p2ExpectedToBeSummoned = false;
|
||||
bool p3ExpectedToBeSummoned = false;
|
||||
|
||||
p1->SummonRequested([&](auto&&, auto&&) {
|
||||
Log::Comment(L"p1 summoned");
|
||||
VERIFY_IS_TRUE(p1ExpectedToBeSummoned);
|
||||
});
|
||||
p2->SummonRequested([&](auto&&, auto&&) {
|
||||
Log::Comment(L"p2 summoned");
|
||||
VERIFY_IS_TRUE(p2ExpectedToBeSummoned);
|
||||
});
|
||||
p3->SummonRequested([&](auto&&, auto&&) {
|
||||
Log::Comment(L"p3 summoned");
|
||||
VERIFY_IS_TRUE(p3ExpectedToBeSummoned);
|
||||
});
|
||||
|
||||
{
|
||||
Log::Comment(L"Activate the first peasant, first desktop");
|
||||
Remoting::WindowActivatedArgs activatedArgs{ p1->GetID(),
|
||||
p1->GetPID(), // USE PID as HWND, because these values don't _really_ matter
|
||||
guid1,
|
||||
winrt::clock().now() };
|
||||
p1->ActivateWindow(activatedArgs);
|
||||
}
|
||||
{
|
||||
Log::Comment(L"Activate the second peasant, second desktop");
|
||||
Remoting::WindowActivatedArgs activatedArgs{ p2->GetID(),
|
||||
p2->GetPID(), // USE PID as HWND, because these values don't _really_ matter
|
||||
guid2,
|
||||
winrt::clock().now() };
|
||||
p2->ActivateWindow(activatedArgs);
|
||||
}
|
||||
{
|
||||
Log::Comment(L"Activate the third peasant, first desktop");
|
||||
Remoting::WindowActivatedArgs activatedArgs{ p3->GetID(),
|
||||
p3->GetPID(), // USE PID as HWND, because these values don't _really_ matter
|
||||
guid1,
|
||||
winrt::clock().now() };
|
||||
p3->ActivateWindow(activatedArgs);
|
||||
}
|
||||
|
||||
Log::Comment(L"Create a mock IVirtualDesktopManager to handle checking if a window is on a given desktop");
|
||||
winrt::com_ptr<MockDesktopManager> manager;
|
||||
manager.attach(new MockDesktopManager());
|
||||
m0->_desktopManager = manager.try_as<IVirtualDesktopManager>();
|
||||
|
||||
auto firstCallback = [&](HWND h, BOOL* result) -> HRESULT {
|
||||
Log::Comment(L"firstCallback: Checking if window is on desktop 1");
|
||||
|
||||
const uint64_t hwnd = reinterpret_cast<uint64_t>(h);
|
||||
if (hwnd == peasant1PID || hwnd == peasant3PID)
|
||||
{
|
||||
*result = true;
|
||||
}
|
||||
else if (hwnd == peasant2PID)
|
||||
{
|
||||
*result = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
VERIFY_IS_TRUE(false, L"IsWindowOnCurrentVirtualDesktop called with unexpected value");
|
||||
}
|
||||
return S_OK;
|
||||
};
|
||||
manager->pfnIsWindowOnCurrentVirtualDesktop = firstCallback;
|
||||
|
||||
Remoting::SummonWindowSelectionArgs args;
|
||||
|
||||
Log::Comment(L"Summon window three - it is the MRU on desktop 1");
|
||||
p3ExpectedToBeSummoned = true;
|
||||
args.OnCurrentDesktop(true);
|
||||
m0->SummonWindow(args);
|
||||
VERIFY_IS_TRUE(args.FoundMatch());
|
||||
{
|
||||
Log::Comment(L"Activate the first peasant, first desktop");
|
||||
Remoting::WindowActivatedArgs activatedArgs{ p1->GetID(),
|
||||
p1->GetPID(), // USE PID as HWND, because these values don't _really_ matter
|
||||
guid1,
|
||||
winrt::clock().now() };
|
||||
p1->ActivateWindow(activatedArgs);
|
||||
}
|
||||
|
||||
Log::Comment(L"Summon window one - it is the MRU on desktop 1");
|
||||
p1ExpectedToBeSummoned = true;
|
||||
p2ExpectedToBeSummoned = false;
|
||||
p3ExpectedToBeSummoned = false;
|
||||
args.FoundMatch(false);
|
||||
args.OnCurrentDesktop(true);
|
||||
m0->SummonWindow(args);
|
||||
VERIFY_IS_TRUE(args.FoundMatch());
|
||||
|
||||
Log::Comment(L"Now we'll pretend we switched to desktop 2");
|
||||
|
||||
auto secondCallback = [&](HWND h, BOOL* result) -> HRESULT {
|
||||
Log::Comment(L"secondCallback: Checking if window is on desktop 2");
|
||||
const uint64_t hwnd = reinterpret_cast<uint64_t>(h);
|
||||
if (hwnd == peasant1PID || hwnd == peasant3PID)
|
||||
{
|
||||
*result = false;
|
||||
}
|
||||
else if (hwnd == peasant2PID)
|
||||
{
|
||||
*result = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
VERIFY_IS_TRUE(false, L"IsWindowOnCurrentVirtualDesktop called with unexpected value");
|
||||
}
|
||||
return S_OK;
|
||||
};
|
||||
manager->pfnIsWindowOnCurrentVirtualDesktop = secondCallback;
|
||||
|
||||
Log::Comment(L"Summon window one - it is the MRU on desktop 2");
|
||||
p1ExpectedToBeSummoned = false;
|
||||
p2ExpectedToBeSummoned = true;
|
||||
p3ExpectedToBeSummoned = false;
|
||||
args.FoundMatch(false);
|
||||
args.OnCurrentDesktop(true);
|
||||
m0->SummonWindow(args);
|
||||
VERIFY_IS_TRUE(args.FoundMatch());
|
||||
|
||||
{
|
||||
Log::Comment(L"Activate the third peasant, second desktop");
|
||||
Remoting::WindowActivatedArgs activatedArgs{ p3->GetID(),
|
||||
p3->GetPID(), // USE PID as HWND, because these values don't _really_ matter
|
||||
guid2,
|
||||
winrt::clock().now() };
|
||||
p3->ActivateWindow(activatedArgs);
|
||||
}
|
||||
|
||||
auto thirdCallback = [&](HWND h, BOOL* result) -> HRESULT {
|
||||
Log::Comment(L"thirdCallback: Checking if window is on desktop 2. (windows 2 and 3 are)");
|
||||
const uint64_t hwnd = reinterpret_cast<uint64_t>(h);
|
||||
if (hwnd == peasant1PID)
|
||||
{
|
||||
*result = false;
|
||||
}
|
||||
else if (hwnd == peasant2PID || hwnd == peasant3PID)
|
||||
{
|
||||
*result = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
VERIFY_IS_TRUE(false, L"IsWindowOnCurrentVirtualDesktop called with unexpected value");
|
||||
}
|
||||
return S_OK;
|
||||
};
|
||||
manager->pfnIsWindowOnCurrentVirtualDesktop = thirdCallback;
|
||||
|
||||
Log::Comment(L"Summon window three - it is the MRU on desktop 2");
|
||||
p1ExpectedToBeSummoned = false;
|
||||
p2ExpectedToBeSummoned = false;
|
||||
p3ExpectedToBeSummoned = true;
|
||||
args.FoundMatch(false);
|
||||
args.OnCurrentDesktop(true);
|
||||
m0->SummonWindow(args);
|
||||
VERIFY_IS_TRUE(args.FoundMatch());
|
||||
|
||||
Log::Comment(L"Now we'll pretend we switched to desktop 1");
|
||||
|
||||
auto fourthCallback = [&](HWND h, BOOL* result) -> HRESULT {
|
||||
Log::Comment(L"fourthCallback: Checking if window is on desktop 1. (window 1 is)");
|
||||
const uint64_t hwnd = reinterpret_cast<uint64_t>(h);
|
||||
if (hwnd == peasant1PID)
|
||||
{
|
||||
*result = true;
|
||||
}
|
||||
else if (hwnd == peasant2PID || hwnd == peasant3PID)
|
||||
{
|
||||
*result = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
VERIFY_IS_TRUE(false, L"IsWindowOnCurrentVirtualDesktop called with unexpected value");
|
||||
}
|
||||
return S_OK;
|
||||
};
|
||||
manager->pfnIsWindowOnCurrentVirtualDesktop = fourthCallback;
|
||||
|
||||
Log::Comment(L"Summon window one - it is the only window on desktop 1");
|
||||
p1ExpectedToBeSummoned = true;
|
||||
p2ExpectedToBeSummoned = false;
|
||||
p3ExpectedToBeSummoned = false;
|
||||
args.FoundMatch(false);
|
||||
args.OnCurrentDesktop(true);
|
||||
m0->SummonWindow(args);
|
||||
VERIFY_IS_TRUE(args.FoundMatch());
|
||||
|
||||
Log::Comment(L"Now we'll pretend we switched to desktop 3");
|
||||
|
||||
auto fifthCallback = [&](HWND h, BOOL* result) -> HRESULT {
|
||||
Log::Comment(L"fifthCallback: Checking if window is on desktop 3. (none are)");
|
||||
const uint64_t hwnd = reinterpret_cast<uint64_t>(h);
|
||||
if (hwnd == peasant1PID || hwnd == peasant2PID || hwnd == peasant3PID)
|
||||
{
|
||||
*result = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
VERIFY_IS_TRUE(false, L"IsWindowOnCurrentVirtualDesktop called with unexpected value");
|
||||
}
|
||||
return S_OK;
|
||||
};
|
||||
manager->pfnIsWindowOnCurrentVirtualDesktop = fifthCallback;
|
||||
|
||||
Log::Comment(L"This summon won't find a window.");
|
||||
p1ExpectedToBeSummoned = false;
|
||||
p2ExpectedToBeSummoned = false;
|
||||
p3ExpectedToBeSummoned = false;
|
||||
args.FoundMatch(false);
|
||||
args.OnCurrentDesktop(true);
|
||||
m0->SummonWindow(args);
|
||||
VERIFY_IS_FALSE(args.FoundMatch());
|
||||
}
|
||||
|
||||
void RemotingTests::TestSummonOnCurrentWithName()
|
||||
{
|
||||
VERIFY_IS_TRUE(false, L"TODO! write tests");
|
||||
}
|
||||
void RemotingTests::TestSummonOnCurrentDeadWindow()
|
||||
{
|
||||
VERIFY_IS_TRUE(false, L"TODO! write tests");
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue