mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-05 18:57:19 +02:00
Migrate FancyZones data persisting from Registry to JSON file (#1194)
* Migrate FancyZones data persisting from Registry to JSON file * Address PR comment: Remove redundant check * Addres PR comment: Remove unused Dpi and add CmdArgs enum * Address PR comment: Make methods const and inline * Address PR comments: Expose GenerateUniqueId function and use const ref instead of passing wstring by value * Address PR comment: Use lamdba as callback * Address PR comment: Move GenerateUniqueId to ZoneWindowUtils namespace * Address PR comment: Use regular comparison instead of std::wstring::compare * Address PR comment: Use std::wstring_view for tmp file paths * Address PR comment: Use scoped lock when accessing member data * Address PR comment: Remove typedefs to increase code readability * Address PR comment: removed nullptr checks with corresponding tests * Address PR comment: Move ZoneSet object instead of copying * Address PR comment: Make FancyZonesData instance const where possible * Remove unnecessary gutter variable during calculating zone coordinates * Remove uneeded subclass * Avoid unnecessary copying and reserve space for vector if possible * Save FancyZones data after exiting editor * App zone history (#18) * added window and zone set ids to app zone history * Rename JSON file * Remove AppZoneHistory migration * Move parsing of ZoneWindow independent temp files outside of it * Unit tests update (#19) * check device existence in map * updated ZoneSet tests * updated JsonHelpers tests * Use single zone count information * Remove uneeded tests * Remove one more test * Remove uneeded line * Address PR comments - Missing whitespace * Update zoneset data for new virtual desktops (#21) * update active zone set with actual data * Introduce Blank zone set (used to indicate that no layout applied yet). Move parsing completely outside of ZoneWindow. * Fix unit tests to match modifications in implementation * Fix applying layouts on startup (second monitor) Co-authored-by: vldmr11080 <57061786+vldmr11080@users.noreply.github.com> Co-authored-by: Seraphima <zykovas91@gmail.com>
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
#include "pch.h"
|
||||
#include "lib\Zone.h"
|
||||
#include "lib\Settings.h"
|
||||
|
||||
#include "Util.h"
|
||||
|
||||
@@ -7,48 +8,419 @@ using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
||||
|
||||
namespace FancyZonesUnitTests
|
||||
{
|
||||
TEST_CLASS(ZoneUnitTests){
|
||||
public:
|
||||
TEST_METHOD(TestCreateZone){
|
||||
RECT zoneRect{ 10, 10, 200, 200 };
|
||||
winrt::com_ptr<IZone> zone = MakeZone(zoneRect);
|
||||
Assert::IsNotNull(&zone);
|
||||
CustomAssert::AreEqual(zoneRect, zone->GetZoneRect());
|
||||
TEST_CLASS(ZoneUnitTests)
|
||||
{
|
||||
private:
|
||||
RECT m_zoneRect{ 10, 10, 200, 200 };
|
||||
HINSTANCE m_hInst{};
|
||||
|
||||
constexpr size_t id = 10;
|
||||
zone->SetId(id);
|
||||
Assert::AreEqual(zone->Id(), id);
|
||||
}
|
||||
HWND addWindow(const winrt::com_ptr<IZone>& zone, bool stamp)
|
||||
{
|
||||
HWND window = Mocks::WindowCreate(m_hInst);
|
||||
HWND zoneWindow = Mocks::WindowCreate(m_hInst);
|
||||
zone->AddWindowToZone(window, zoneWindow, stamp);
|
||||
|
||||
TEST_METHOD(ContainsWindow)
|
||||
{
|
||||
RECT zoneRect{ 10, 10, 200, 200 };
|
||||
winrt::com_ptr<IZone> zone = MakeZone(zoneRect);
|
||||
HWND newWindow = Mocks::Window();
|
||||
Assert::IsFalse(zone->ContainsWindow(newWindow));
|
||||
}
|
||||
return window;
|
||||
}
|
||||
|
||||
TEST_METHOD(TestAddRemoveWindow)
|
||||
{
|
||||
RECT zoneRect{ 10, 10, 200, 200 };
|
||||
winrt::com_ptr<IZone> zone = MakeZone(zoneRect);
|
||||
HWND newWindow = Mocks::Window();
|
||||
void addMany(const winrt::com_ptr<IZone>& zone)
|
||||
{
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
addWindow(zone, i % 2 == 0);
|
||||
}
|
||||
}
|
||||
|
||||
Assert::IsFalse(zone->ContainsWindow(newWindow));
|
||||
zone->AddWindowToZone(newWindow, Mocks::Window(), true);
|
||||
Assert::IsTrue(zone->ContainsWindow(newWindow));
|
||||
TEST_METHOD_INITIALIZE(Init)
|
||||
{
|
||||
m_hInst = (HINSTANCE)GetModuleHandleW(nullptr);
|
||||
}
|
||||
|
||||
zone->RemoveWindowFromZone(newWindow, false);
|
||||
Assert::IsFalse(zone->ContainsWindow(newWindow));
|
||||
}
|
||||
public:
|
||||
TEST_METHOD(TestCreateZone)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
Assert::IsNotNull(&zone);
|
||||
CustomAssert::AreEqual(m_zoneRect, zone->GetZoneRect());
|
||||
}
|
||||
|
||||
TEST_METHOD(TestRemoveInvalidWindow)
|
||||
{
|
||||
RECT zoneRect{ 10, 10, 200, 200 };
|
||||
winrt::com_ptr<IZone> zone = MakeZone(zoneRect);
|
||||
HWND newWindow = Mocks::Window();
|
||||
zone->RemoveWindowFromZone(newWindow, false);
|
||||
}
|
||||
}
|
||||
;
|
||||
TEST_METHOD(TestCreateZoneZeroRect)
|
||||
{
|
||||
RECT zoneRect{ 0, 0, 0, 0 };
|
||||
winrt::com_ptr<IZone> zone = MakeZone(zoneRect);
|
||||
Assert::IsNotNull(&zone);
|
||||
CustomAssert::AreEqual(zoneRect, zone->GetZoneRect());
|
||||
}
|
||||
|
||||
TEST_METHOD(GetSetId)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
|
||||
constexpr size_t id = 10;
|
||||
zone->SetId(id);
|
||||
Assert::AreEqual(zone->Id(), id);
|
||||
}
|
||||
|
||||
TEST_METHOD(IsEmpty)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
Assert::IsTrue(zone->IsEmpty());
|
||||
}
|
||||
|
||||
TEST_METHOD(IsNonEmptyStampTrue)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
addWindow(zone, true);
|
||||
|
||||
Assert::IsFalse(zone->IsEmpty());
|
||||
}
|
||||
|
||||
TEST_METHOD(IsNonEmptyStampFalse)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
addWindow(zone, false);
|
||||
|
||||
Assert::IsFalse(zone->IsEmpty());
|
||||
}
|
||||
|
||||
TEST_METHOD(IsNonEmptyManyWindows)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
|
||||
HWND zoneWindow = Mocks::WindowCreate(m_hInst);
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
HWND window = Mocks::WindowCreate(m_hInst);
|
||||
zone->AddWindowToZone(window, zoneWindow, i % 2 == 0);
|
||||
}
|
||||
|
||||
Assert::IsFalse(zone->IsEmpty());
|
||||
}
|
||||
|
||||
TEST_METHOD(IsNonEmptyManyZoneWindows)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
|
||||
HWND window = Mocks::WindowCreate(m_hInst);
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
HWND zoneWindow = Mocks::WindowCreate(m_hInst);
|
||||
zone->AddWindowToZone(window, zoneWindow, i % 2 == 0);
|
||||
}
|
||||
|
||||
Assert::IsFalse(zone->IsEmpty());
|
||||
}
|
||||
|
||||
TEST_METHOD(IsNonEmptyMany)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
addMany(zone);
|
||||
|
||||
Assert::IsFalse(zone->IsEmpty());
|
||||
}
|
||||
|
||||
TEST_METHOD(ContainsWindowEmpty)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
HWND newWindow = Mocks::WindowCreate(m_hInst);
|
||||
Assert::IsFalse(zone->ContainsWindow(newWindow));
|
||||
}
|
||||
|
||||
TEST_METHOD(ContainsWindowNot)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
addMany(zone);
|
||||
|
||||
HWND newWindow = Mocks::WindowCreate(m_hInst);
|
||||
Assert::IsFalse(zone->ContainsWindow(newWindow));
|
||||
}
|
||||
|
||||
TEST_METHOD(ContainsWindowStampTrue)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
HWND window = addWindow(zone, true);
|
||||
|
||||
Assert::IsTrue(zone->ContainsWindow(window));
|
||||
}
|
||||
|
||||
TEST_METHOD(ContainsWindowStampFalse)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
HWND window = addWindow(zone, false);
|
||||
|
||||
Assert::IsTrue(zone->ContainsWindow(window));
|
||||
}
|
||||
|
||||
TEST_METHOD(ContainsWindowManyWindows)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
|
||||
HWND zoneWindow = Mocks::WindowCreate(m_hInst);
|
||||
std::vector<HWND> windowVec{};
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
HWND window = Mocks::WindowCreate(m_hInst);
|
||||
windowVec.push_back(window);
|
||||
zone->AddWindowToZone(window, zoneWindow, i % 2 == 0);
|
||||
}
|
||||
|
||||
for (auto wnd : windowVec)
|
||||
{
|
||||
Assert::IsTrue(zone->ContainsWindow(wnd));
|
||||
}
|
||||
}
|
||||
|
||||
TEST_METHOD(ContainsWindowManyZoneWindows)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
|
||||
HWND window = Mocks::WindowCreate(m_hInst);
|
||||
std::vector<HWND> windowVec{};
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
HWND zoneWindow = Mocks::WindowCreate(m_hInst);
|
||||
windowVec.push_back(window);
|
||||
zone->AddWindowToZone(window, zoneWindow, i % 2 == 0);
|
||||
}
|
||||
|
||||
for (auto wnd : windowVec)
|
||||
{
|
||||
Assert::IsTrue(zone->ContainsWindow(wnd));
|
||||
}
|
||||
}
|
||||
|
||||
TEST_METHOD(ContainsWindowMany)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
|
||||
std::vector<HWND> windowVec{};
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
HWND window = addWindow(zone, i % 2 == 0);
|
||||
windowVec.push_back(window);
|
||||
}
|
||||
|
||||
for (auto wnd : windowVec)
|
||||
{
|
||||
Assert::IsTrue(zone->ContainsWindow(wnd));
|
||||
}
|
||||
}
|
||||
|
||||
TEST_METHOD(AddWindowNullptr)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
|
||||
HWND window = nullptr;
|
||||
HWND zoneWindow = Mocks::WindowCreate(m_hInst);
|
||||
zone->AddWindowToZone(window, zoneWindow, true);
|
||||
|
||||
Assert::IsFalse(zone->IsEmpty());
|
||||
Assert::IsTrue(zone->ContainsWindow(window));
|
||||
}
|
||||
|
||||
TEST_METHOD(AddWindowZoneNullptr)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
|
||||
HWND window = Mocks::WindowCreate(m_hInst);
|
||||
HWND zoneWindow = nullptr;
|
||||
zone->AddWindowToZone(window, zoneWindow, true);
|
||||
|
||||
Assert::IsFalse(zone->IsEmpty());
|
||||
Assert::IsTrue(zone->ContainsWindow(window));
|
||||
}
|
||||
|
||||
TEST_METHOD(AddManySame)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
|
||||
HWND zoneWindow = Mocks::WindowCreate(m_hInst);
|
||||
HWND window = Mocks::WindowCreate(m_hInst);
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
zone->AddWindowToZone(window, zoneWindow, i % 2 == 0);
|
||||
}
|
||||
|
||||
Assert::IsFalse(zone->IsEmpty());
|
||||
Assert::IsTrue(zone->ContainsWindow(window));
|
||||
}
|
||||
|
||||
TEST_METHOD(AddManySameNullptr)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
|
||||
HWND zoneWindow = nullptr;
|
||||
HWND window = nullptr;
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
zone->AddWindowToZone(window, zoneWindow, i % 2 == 0);
|
||||
}
|
||||
|
||||
Assert::IsTrue(zone->ContainsWindow(window));
|
||||
}
|
||||
|
||||
TEST_METHOD(RemoveWindowRestoreSizeTrue)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
HWND newWindow = Mocks::WindowCreate(m_hInst);
|
||||
|
||||
zone->AddWindowToZone(newWindow, Mocks::WindowCreate(m_hInst), true);
|
||||
Assert::IsFalse(zone->IsEmpty());
|
||||
Assert::IsTrue(zone->ContainsWindow(newWindow));
|
||||
|
||||
zone->RemoveWindowFromZone(newWindow, true);
|
||||
Assert::IsTrue(zone->IsEmpty());
|
||||
Assert::IsFalse(zone->ContainsWindow(newWindow));
|
||||
}
|
||||
|
||||
TEST_METHOD(RemoveWindowRestoreSizeFalse)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
HWND newWindow = Mocks::WindowCreate(m_hInst);
|
||||
|
||||
zone->AddWindowToZone(newWindow, Mocks::WindowCreate(m_hInst), true);
|
||||
Assert::IsFalse(zone->IsEmpty());
|
||||
Assert::IsTrue(zone->ContainsWindow(newWindow));
|
||||
|
||||
zone->RemoveWindowFromZone(newWindow, false);
|
||||
Assert::IsTrue(zone->IsEmpty());
|
||||
Assert::IsFalse(zone->ContainsWindow(newWindow));
|
||||
}
|
||||
|
||||
TEST_METHOD(RemoveInvalidWindowRestoreSizeTrue)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
HWND newWindow = Mocks::WindowCreate(m_hInst);
|
||||
zone->RemoveWindowFromZone(newWindow, true);
|
||||
|
||||
Assert::IsTrue(zone->IsEmpty());
|
||||
Assert::IsFalse(zone->ContainsWindow(newWindow));
|
||||
}
|
||||
|
||||
TEST_METHOD(RemoveInvalidWindowRestoreSizeFalse)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
HWND newWindow = Mocks::WindowCreate(m_hInst);
|
||||
zone->RemoveWindowFromZone(newWindow, false);
|
||||
|
||||
Assert::IsTrue(zone->IsEmpty());
|
||||
Assert::IsFalse(zone->ContainsWindow(newWindow));
|
||||
}
|
||||
|
||||
TEST_METHOD(RemoveNullptrWindowRestoreSizeTrue)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
HWND newWindow = nullptr;
|
||||
|
||||
zone->AddWindowToZone(newWindow, Mocks::WindowCreate(m_hInst), true);
|
||||
Assert::IsFalse(zone->IsEmpty());
|
||||
Assert::IsTrue(zone->ContainsWindow(newWindow));
|
||||
|
||||
zone->RemoveWindowFromZone(newWindow, true);
|
||||
Assert::IsTrue(zone->IsEmpty());
|
||||
Assert::IsFalse(zone->ContainsWindow(newWindow));
|
||||
}
|
||||
|
||||
TEST_METHOD(RemoveNullptrWindowRestoreSizeFalse)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
HWND newWindow = nullptr;
|
||||
|
||||
zone->AddWindowToZone(newWindow, Mocks::WindowCreate(m_hInst), true);
|
||||
Assert::IsFalse(zone->IsEmpty());
|
||||
Assert::IsTrue(zone->ContainsWindow(newWindow));
|
||||
|
||||
zone->RemoveWindowFromZone(newWindow, false);
|
||||
Assert::IsTrue(zone->IsEmpty());
|
||||
Assert::IsFalse(zone->ContainsWindow(newWindow));
|
||||
}
|
||||
|
||||
TEST_METHOD(RemoveMany)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
|
||||
std::vector<HWND> windowVec{};
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
HWND window = addWindow(zone, i % 2 == 0);
|
||||
windowVec.push_back(window);
|
||||
}
|
||||
|
||||
for (auto wnd : windowVec)
|
||||
{
|
||||
zone->RemoveWindowFromZone(wnd, true);
|
||||
}
|
||||
|
||||
Assert::IsTrue(zone->IsEmpty());
|
||||
}
|
||||
|
||||
TEST_METHOD(RemoveManySame)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
|
||||
HWND zoneWindow = Mocks::WindowCreate(m_hInst);
|
||||
HWND window = Mocks::WindowCreate(m_hInst);
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
zone->AddWindowToZone(window, zoneWindow, i % 2 == 0);
|
||||
}
|
||||
|
||||
zone->RemoveWindowFromZone(window, true);
|
||||
|
||||
Assert::IsTrue(zone->IsEmpty());
|
||||
Assert::IsFalse(zone->ContainsWindow(window));
|
||||
}
|
||||
|
||||
TEST_METHOD(RemoveDouble)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
|
||||
HWND zoneWindow = Mocks::WindowCreate(m_hInst);
|
||||
HWND window = Mocks::WindowCreate(m_hInst);
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
zone->AddWindowToZone(window, zoneWindow, i % 2 == 0);
|
||||
}
|
||||
|
||||
zone->RemoveWindowFromZone(window, true);
|
||||
zone->RemoveWindowFromZone(window, true);
|
||||
|
||||
Assert::IsTrue(zone->IsEmpty());
|
||||
}
|
||||
|
||||
TEST_METHOD(StampTrue)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
size_t expected = 123456;
|
||||
zone->SetId(expected);
|
||||
|
||||
HWND window = addWindow(zone, true);
|
||||
|
||||
HANDLE actual = GetProp(window, ZONE_STAMP);
|
||||
Assert::IsNotNull(actual);
|
||||
|
||||
size_t actualVal = HandleToLong(actual);
|
||||
Assert::AreEqual(expected, actualVal);
|
||||
}
|
||||
|
||||
TEST_METHOD(StampTrueNoId)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
|
||||
HWND window = addWindow(zone, true);
|
||||
|
||||
HANDLE actual = GetProp(window, ZONE_STAMP);
|
||||
Assert::IsNull(actual);
|
||||
}
|
||||
|
||||
TEST_METHOD(StampFalse)
|
||||
{
|
||||
winrt::com_ptr<IZone> zone = MakeZone(m_zoneRect);
|
||||
|
||||
HWND window = addWindow(zone, false);
|
||||
|
||||
HANDLE actual = GetProp(window, ZONE_STAMP);
|
||||
Assert::IsNull(actual);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user