[FancyZones] Editor multi monitor support (#6562)

Co-authored-by: Enrico Giordani <enrico.giordani@gmail.com>
Co-authored-by: Enrico Giordani <enricogior@users.noreply.github.com>
This commit is contained in:
Seraphima Zykova
2020-11-17 11:38:19 +03:00
committed by GitHub
parent 687fc2e169
commit b8e5ccfb7b
88 changed files with 4887 additions and 1503 deletions

View File

@@ -938,6 +938,92 @@ namespace FancyZonesUnitTests
}
};
TEST_CLASS(AppliedZonesetsUnitTests)
{
TEST_METHOD(SingleDevice)
{
const std::wstring deviceId = L"AOC2460#4&fe3a015&0&UID65793_1920_1200_{39B25DD2-130D-4B5D-8851-4791D66B1539}";
const std::wstring zoneUuid = L"{33A2B101-06E0-437B-A61E-CDBECF502906}";
const ZoneSetLayoutType type = ZoneSetLayoutType::Custom;
DeviceInfoData data{ ZoneSetData{ zoneUuid, type }, true, 10, 4 };
TDeviceInfoMap expected;
expected.insert(std::make_pair(deviceId, data));
json::JsonObject json = AppliedZonesetsJSON::ToJson(expected);
auto actual = AppliedZonesetsJSON::FromJson(json);
Assert::IsTrue(actual.has_value());
Assert::AreEqual(expected.size(), actual->size());
for (const auto& exp : expected)
{
Assert::IsTrue(actual->contains(exp.first));
const auto act = actual->find(exp.first);
Assert::AreEqual(exp.second.zoneCount, act->second.zoneCount);
Assert::AreEqual(exp.second.showSpacing, act->second.showSpacing);
Assert::AreEqual(exp.second.spacing, act->second.spacing);
Assert::AreEqual(exp.second.activeZoneSet.uuid, act->second.activeZoneSet.uuid);
Assert::AreEqual((int)exp.second.activeZoneSet.type, (int)act->second.activeZoneSet.type);
}
}
TEST_METHOD (MultipleDevices)
{
TDeviceInfoMap expected;
expected.insert(std::make_pair(L"AOC2460#4&fe3a015&0&UID65793_1920_1200_{39B25DD2-130D-4B5D-8851-4791D66B1539}", DeviceInfoData{ ZoneSetData{ L"{33A2B101-06E0-437B-A61E-CDBECF502906}", ZoneSetLayoutType::Columns }, true, 10, 4 }));
expected.insert(std::make_pair(L"AOC2460#4&fe3a015&0&UID65793_1920_1200_{39B25DD2-130D-4B5D-8851-4791D66B1538}", DeviceInfoData{ ZoneSetData{ L"{33A2B101-06E0-437B-A61E-CDBECF502905}", ZoneSetLayoutType::Rows }, false, 8, 5 }));
expected.insert(std::make_pair(L"AOC2460#4&fe3a015&0&UID65793_1920_1200_{39B25DD2-130D-4B5D-8851-4791D66B1537}", DeviceInfoData{ ZoneSetData{ L"{33A2B101-06E0-437B-A61E-CDBECF502904}", ZoneSetLayoutType::Grid }, true, 9, 6 }));
json::JsonObject json = AppliedZonesetsJSON::ToJson(expected);
auto actual = AppliedZonesetsJSON::FromJson(json);
Assert::IsTrue(actual.has_value());
Assert::AreEqual(expected.size(), actual->size());
for (const auto& exp : expected)
{
Assert::IsTrue(actual->contains(exp.first));
const auto act = actual->find(exp.first);
Assert::AreEqual(exp.second.zoneCount, act->second.zoneCount);
Assert::AreEqual(exp.second.showSpacing, act->second.showSpacing);
Assert::AreEqual(exp.second.spacing, act->second.spacing);
Assert::AreEqual(exp.second.activeZoneSet.uuid, act->second.activeZoneSet.uuid);
Assert::AreEqual((int)exp.second.activeZoneSet.type, (int)act->second.activeZoneSet.type);
}
}
TEST_METHOD (FromJsonNoDeviceId)
{
json::JsonObject json = json::JsonObject::Parse(L"{\"applied-zonesets\": [{\"device-id\": \"\",\"active-zoneset\": {\"uuid\": \"{81B9FCD3-88CA-4B21-A681-5D1129A1527F}\",\"type\": \"grid\"},\"editor-show-spacing\": true,\"editor-spacing\": 5,\"editor-zone-count\": 4},{\"device-id\": \"\",\"active-zoneset\": {\"uuid\": \"{8110E0D5-4815-4A35-A5AC-DF82A65FF58B}\",\"type\": \"priority-grid\"},\"editor-show-spacing\": false,\"editor-spacing\": 6,\"editor-zone-count\": 2}]}");
auto actual = AppliedZonesetsJSON::FromJson(json);
Assert::IsTrue(actual.has_value());
Assert::IsTrue(actual->empty());
}
TEST_METHOD (FromInvalidJsonNotArray)
{
json::JsonObject json = json::JsonObject::Parse(L"{\"applied-zonesets\": {\"device-id\": \"\",\"active-zoneset\": {\"uuid\": \"{81B9FCD3-88CA-4B21-A681-5D1129A1527F}\",\"type\": \"grid\"},\"editor-show-spacing\": true,\"editor-spacing\": 5,\"editor-zone-count\": 4}}");
auto actual = AppliedZonesetsJSON::FromJson(json);
Assert::IsFalse(actual.has_value());
}
TEST_METHOD (FromEmptyJson)
{
json::JsonObject json = json::JsonObject::Parse(L"{}");
auto actual = AppliedZonesetsJSON::FromJson(json);
Assert::IsFalse(actual.has_value());
}
TEST_METHOD (FromEmptyDeviceArray)
{
json::JsonObject json = json::JsonObject::Parse(L"{\"applied-zonesets\": []}");
auto actual = AppliedZonesetsJSON::FromJson(json);
Assert::IsTrue(actual.has_value());
Assert::IsTrue(actual->empty());
}
};
TEST_CLASS (FancyZonesDataUnitTests)
{
private:
@@ -947,6 +1033,8 @@ namespace FancyZonesUnitTests
const json::JsonValue m_defaultCustomDeviceValue = json::JsonValue::Parse(m_defaultCustomDeviceStr);
const json::JsonObject m_defaultCustomDeviceObj = json::JsonObject::Parse(m_defaultCustomDeviceStr);
GUID m_defaultVDId;
HINSTANCE m_hInst{};
FancyZonesData& m_fzData = FancyZonesDataInstance();
@@ -964,6 +1052,10 @@ namespace FancyZonesUnitTests
m_hInst = (HINSTANCE)GetModuleHandleW(nullptr);
m_fzData.clear_data();
std::filesystem::remove_all(PTSettingsHelper::get_module_save_folder_location(m_moduleName));
auto guid = Helpers::StringToGuid(L"{39B25DD2-130D-4B5D-8851-4791D66B1539}");
Assert::IsTrue(guid.has_value());
m_defaultVDId = *guid;
}
TEST_METHOD_CLEANUP(CleanUp)
@@ -1098,15 +1190,18 @@ namespace FancyZonesUnitTests
{
FancyZonesData data;
data.SetSettingsModulePath(m_moduleName);
DeviceInfoJSON deviceInfo{ L"default_device_id", DeviceInfoData{ ZoneSetData{ L"uuid", ZoneSetLayoutType::Custom }, true, 16, 3 } };
TDeviceInfoMap deviceInfoMap;
DeviceInfoData deviceInfoData{ ZoneSetData{ L"uuid", ZoneSetLayoutType::Custom }, true, 16, 3 };
deviceInfoMap.insert(std::make_pair(m_defaultDeviceId, deviceInfoData));
const std::wstring path = data.zonesSettingsFileName + L".test_tmp";
JSONHelpers::SerializeDeviceInfoToTmpFile(deviceInfo, path);
JSONHelpers::SerializeDeviceInfoToTmpFile(deviceInfoMap, m_defaultVDId, path);
bool actualFileExists = std::filesystem::exists(path);
Assert::IsTrue(actualFileExists);
auto expectedData = DeviceInfoJSON::ToJson(deviceInfo);
auto expectedData = AppliedZonesetsJSON::ToJson(deviceInfoMap);
auto actualSavedData = json::from_file(path);
std::filesystem::remove(path); //clean up before compare asserts
@@ -1118,10 +1213,15 @@ namespace FancyZonesUnitTests
{
FancyZonesData data;
data.SetSettingsModulePath(m_moduleName);
const std::wstring deviceId = m_defaultDeviceId;
DeviceInfoJSON expected{ deviceId, DeviceInfoData{ ZoneSetData{ L"{33A2B101-06E0-437B-A61E-CDBECF502906}", ZoneSetLayoutType::Custom }, true, 16, 3 } };
DeviceInfoData expected{ ZoneSetData{ L"{33A2B101-06E0-437B-A61E-CDBECF502906}", ZoneSetLayoutType::Custom }, true, 16, 3 };
TDeviceInfoMap expectedDeviceInfoMap;
expectedDeviceInfoMap.insert(std::make_pair(deviceId, expected));
const std::wstring path = data.zonesSettingsFileName + L".test_tmp";
JSONHelpers::SerializeDeviceInfoToTmpFile(expected, path);
JSONHelpers::SerializeDeviceInfoToTmpFile(expectedDeviceInfoMap, m_defaultVDId, path);
data.ParseDeviceInfoFromTmpFile(path);
@@ -1136,11 +1236,11 @@ namespace FancyZonesUnitTests
Assert::AreEqual((size_t)1, devices.size());
auto actual = devices.find(deviceId)->second;
Assert::AreEqual(expected.data.showSpacing, actual.showSpacing);
Assert::AreEqual(expected.data.spacing, actual.spacing);
Assert::AreEqual(expected.data.zoneCount, actual.zoneCount);
Assert::AreEqual((int)expected.data.activeZoneSet.type, (int)actual.activeZoneSet.type);
Assert::AreEqual(expected.data.activeZoneSet.uuid.c_str(), actual.activeZoneSet.uuid.c_str());
Assert::AreEqual(expected.showSpacing, actual.showSpacing);
Assert::AreEqual(expected.spacing, actual.spacing);
Assert::AreEqual(expected.zoneCount, actual.zoneCount);
Assert::AreEqual((int)expected.activeZoneSet.type, (int)actual.activeZoneSet.type);
Assert::AreEqual(expected.activeZoneSet.uuid.c_str(), actual.activeZoneSet.uuid.c_str());
}
TEST_METHOD (DeviceInfoReadTempNonexistent)
@@ -1525,9 +1625,12 @@ namespace FancyZonesUnitTests
const std::wstring deviceId = L"default_device_id";
{
DeviceInfoJSON deviceInfo{ deviceId, DeviceInfoData{ ZoneSetData{ L"{33A2B101-06E0-437B-A61E-CDBECF502906}", ZoneSetLayoutType::Custom }, true, 16, 3 } };
TDeviceInfoMap deviceInfoMap;
DeviceInfoData deviceInfoData { ZoneSetData{ L"{33A2B101-06E0-437B-A61E-CDBECF502906}", ZoneSetLayoutType::Custom }, true, 16, 3 };
deviceInfoMap.insert(std::make_pair(deviceId, deviceInfoData));
const std::wstring deviceInfoPath = m_fzData.zonesSettingsFileName + L".device_info_tmp";
JSONHelpers::SerializeDeviceInfoToTmpFile(deviceInfo, deviceInfoPath);
JSONHelpers::SerializeDeviceInfoToTmpFile(deviceInfoMap, m_defaultVDId, deviceInfoPath);
m_fzData.ParseDeviceInfoFromTmpFile(deviceInfoPath);
std::filesystem::remove(deviceInfoPath);
@@ -1540,13 +1643,18 @@ namespace FancyZonesUnitTests
.rowsPercents = { 10000 },
.columnsPercents = { 2500, 5000, 2500 },
.cellChildMap = { { 0, 1, 2 } } }));
CustomZoneSetJSON expected{ uuid, CustomZoneSetData{ L"name", CustomLayoutType::Grid, grid } };
CustomZoneSetData zoneSetData{ L"name", CustomLayoutType::Grid, grid };
CustomZoneSetJSON expected{ uuid, zoneSetData };
FancyZonesData data;
data.SetSettingsModulePath(m_moduleName);
const std::wstring path = data.zonesSettingsFileName + L".test_tmp";
json::to_file(path, CustomZoneSetJSON::ToJson(expected));
m_fzData.ParseCustomZoneSetFromTmpFile(path);
TCustomZoneSetsMap customZoneSets;
customZoneSets.insert(std::make_pair(uuid, zoneSetData));
JSONHelpers::SerializeCustomZoneSetsToTmpFile(customZoneSets, path);
m_fzData.ParseCustomZoneSetsFromTmpFile(path);
bool actualFileExists = std::filesystem::exists(path);
if (actualFileExists)
@@ -1572,7 +1680,7 @@ namespace FancyZonesUnitTests
const std::wstring path = m_fzData.zonesSettingsFileName + L".test_tmp";
const std::wstring deviceId = L"default_device_id";
m_fzData.ParseCustomZoneSetFromTmpFile(path);
m_fzData.ParseCustomZoneSetsFromTmpFile(path);
auto devices = m_fzData.GetDeviceInfoMap();
Assert::AreEqual((size_t)0, devices.size());
}

View File

@@ -40,28 +40,143 @@ namespace FancyZonesUnitTests
TEST_CLASS(UtilUnitTests)
{
TEST_METHOD(TestParseDeviceId)
TEST_METHOD (TestTrimDeviceId)
{
// We're interested in the unique part between the first and last #'s
// Example input: \\?\DISPLAY#DELA026#5&10a58c63&0&UID16777488#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
// Example output: DELA026#5&10a58c63&0&UID16777488
const std::wstring input = L"\\\\?\\DISPLAY#DELA026#5&10a58c63&0&UID16777488#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}";
const std::wstring actual = ParseDeviceId(input);
const std::wstring actual = TrimDeviceId(input);
const std::wstring expected = L"DELA026#5&10a58c63&0&UID16777488";
Assert::AreEqual(expected, actual);
}
TEST_METHOD(TestParseInvalidDeviceId)
TEST_METHOD(TestTrimInvalidDeviceId)
{
// We're interested in the unique part between the first and last #'s
// Example input: \\?\DISPLAY#DELA026#5&10a58c63&0&UID16777488#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
// Example output: DELA026#5&10a58c63&0&UID16777488
const std::wstring input = L"AnInvalidDeviceId";
const std::wstring actual = ParseDeviceId(input);
const std::wstring actual = TrimDeviceId(input);
const std::wstring expected = L"FallbackDevice";
Assert::AreEqual(expected, actual);
}
TEST_METHOD(TestParseDeviceId01)
{
const std::wstring input = L"AOC0001#5&37ac4db&0&UID160002_1536_960_{E0A2904E-889C-4532-95B1-28FE15C16F66}";
GUID guid;
const auto expectedGuidStr = L"{E0A2904E-889C-4532-95B1-28FE15C16F66}";
CLSIDFromString(expectedGuidStr, &guid);
const FancyZonesDataTypes::DeviceIdData expected{ L"AOC0001#5&37ac4db&0&UID160002", 1536, 960, guid };
const auto actual = ParseDeviceId(input);
Assert::IsTrue(actual.has_value());
Assert::AreEqual(expected.deviceName, actual->deviceName);
Assert::AreEqual(expected.height, actual->height);
Assert::AreEqual(expected.width, actual->width);
Assert::AreEqual(expected.monitorId, actual->monitorId);
wil::unique_cotaskmem_string actualGuidStr;
StringFromCLSID(actual->virtualDesktopId, &actualGuidStr);
Assert::AreEqual(expectedGuidStr, actualGuidStr.get());
}
TEST_METHOD (TestParseDeviceId02)
{
const std::wstring input = L"AOC0001#5&37ac4db&0&UID160002_1536_960_{E0A2904E-889C-4532-95B1-28FE15C16F66}_monitorId";
GUID guid;
const auto expectedGuidStr = L"{E0A2904E-889C-4532-95B1-28FE15C16F66}";
CLSIDFromString(expectedGuidStr, &guid);
const FancyZonesDataTypes::DeviceIdData expected{ L"AOC0001#5&37ac4db&0&UID160002", 1536, 960, guid, L"monitorId" };
const auto actual = ParseDeviceId(input);
Assert::IsTrue(actual.has_value());
Assert::AreEqual(expected.deviceName, actual->deviceName);
Assert::AreEqual(expected.height, actual->height);
Assert::AreEqual(expected.width, actual->width);
Assert::AreEqual(expected.monitorId, actual->monitorId);
wil::unique_cotaskmem_string actualGuidStr;
StringFromCLSID(actual->virtualDesktopId, &actualGuidStr);
Assert::AreEqual(expectedGuidStr, actualGuidStr.get());
}
TEST_METHOD (TestParseDeviceId03)
{
// difference with previous tests is in the device name: there is no # symbol
const std::wstring input = L"AOC00015&37ac4db&0&UID160002_1536_960_{E0A2904E-889C-4532-95B1-28FE15C16F66}";
GUID guid;
const auto expectedGuidStr = L"{E0A2904E-889C-4532-95B1-28FE15C16F66}";
CLSIDFromString(expectedGuidStr, &guid);
const FancyZonesDataTypes::DeviceIdData expected{ L"AOC00015&37ac4db&0&UID160002", 1536, 960, guid };
const auto actual = ParseDeviceId(input);
Assert::IsTrue(actual.has_value());
Assert::AreEqual(expected.deviceName, actual->deviceName);
Assert::AreEqual(expected.height, actual->height);
Assert::AreEqual(expected.width, actual->width);
Assert::AreEqual(expected.monitorId, actual->monitorId);
wil::unique_cotaskmem_string actualGuidStr;
StringFromCLSID(actual->virtualDesktopId, &actualGuidStr);
Assert::AreEqual(expectedGuidStr, actualGuidStr.get());
}
TEST_METHOD (TestParseDeviceIdInvalid01)
{
// no width or height
const std::wstring input = L"AOC00015&37ac4db&0&UID160002_1536960_{E0A2904E-889C-4532-95B1-28FE15C16F66}";
const auto actual = ParseDeviceId(input);
Assert::IsFalse(actual.has_value());
}
TEST_METHOD (TestParseDeviceIdInvalid02)
{
// no width and height
const std::wstring input = L"AOC00015&37ac4db&0&UID160002_{E0A2904E-889C-4532-95B1-28FE15C16F66}_monitorId";
const auto actual = ParseDeviceId(input);
Assert::IsFalse(actual.has_value());
}
TEST_METHOD (TestParseDeviceIdInvalid03)
{
// no guid
const std::wstring input = L"AOC00015&37ac4db&0&UID160002_1536960_";
const auto actual = ParseDeviceId(input);
Assert::IsFalse(actual.has_value());
}
TEST_METHOD (TestParseDeviceIdInvalid04)
{
// invalid guid
const std::wstring input = L"AOC00015&37ac4db&0&UID160002_1536960_{asdf}";
const auto actual = ParseDeviceId(input);
Assert::IsFalse(actual.has_value());
}
TEST_METHOD (TestParseDeviceIdInvalid05)
{
// invalid width/height
const std::wstring input = L"AOC00015&37ac4db&0&UID160002_15a6_960_{E0A2904E-889C-4532-95B1-28FE15C16F66}";
const auto actual = ParseDeviceId(input);
Assert::IsFalse(actual.has_value());
}
TEST_METHOD (TestParseDeviceIdInvalid06)
{
// changed order
const std::wstring input = L"AOC00015&37ac4db&0&UID160002_15a6_960_monitorId_{E0A2904E-889C-4532-95B1-28FE15C16F66}";
const auto actual = ParseDeviceId(input);
Assert::IsFalse(actual.has_value());
}
TEST_METHOD(TestMonitorOrdering01)
{
// Three horizontally arranged monitors, bottom aligned, with increasing sizes

View File

@@ -172,3 +172,14 @@ std::wstring Helpers::CreateGuidString()
return L"";
}
std::optional<GUID> Helpers::StringToGuid(const std::wstring& str)
{
GUID guid;
if (CLSIDFromString(str.c_str(), &guid) == S_OK)
{
return guid;
}
return std::nullopt;
}

View File

@@ -57,6 +57,7 @@ namespace Helpers
{
std::wstring GuidToString(const GUID& guid);
std::wstring CreateGuidString();
std::optional<GUID> StringToGuid(const std::wstring& str);
}
template<>

View File

@@ -2,6 +2,7 @@
#include "lib\FancyZonesData.h"
#include "lib\FancyZonesDataTypes.h"
#include "lib\JsonHelpers.h"
#include "lib\VirtualDesktopUtils.h"
#include "lib\ZoneSet.h"
#include <filesystem>
@@ -1048,9 +1049,14 @@ namespace FancyZonesUnitTests
//prepare device data
{
const std::wstring zoneUuid = L"default_device_id";
JSONHelpers::DeviceInfoJSON deviceInfo{ zoneUuid, DeviceInfoData{ ZoneSetData{ L"uuid", ZoneSetLayoutType::Custom }, true, 16, 3 } };
JSONHelpers::TDeviceInfoMap deviceInfoMap;
deviceInfoMap.insert(std::make_pair(zoneUuid, DeviceInfoData{ ZoneSetData{ L"uuid", ZoneSetLayoutType::Custom }, true, 16, 3 }));
GUID virtualDesktopId{};
Assert::IsTrue(VirtualDesktopUtils::GetCurrentVirtualDesktopId(&virtualDesktopId), L"Cannot create virtual desktop id");
const std::wstring deviceInfoPath = FancyZonesDataInstance().zonesSettingsFileName + L".device_info_tmp";
JSONHelpers::SerializeDeviceInfoToTmpFile(deviceInfo, deviceInfoPath);
JSONHelpers::SerializeDeviceInfoToTmpFile(deviceInfoMap, virtualDesktopId, deviceInfoPath);
FancyZonesDataInstance().ParseDeviceInfoFromTmpFile(deviceInfoPath);
std::filesystem::remove(deviceInfoPath);
@@ -1060,10 +1066,14 @@ namespace FancyZonesUnitTests
wil::unique_cotaskmem_string uuid;
Assert::AreEqual(S_OK, StringFromCLSID(m_id, &uuid));
const CanvasLayoutInfo info{ 123, 321, { CanvasLayoutInfo::Rect{ 0, 0, 100, 100 }, CanvasLayoutInfo::Rect{ 50, 50, 150, 150 } } };
JSONHelpers::CustomZoneSetJSON expected{ uuid.get(), CustomZoneSetData{ L"name", CustomLayoutType::Canvas, info } };
json::to_file(m_path, JSONHelpers::CustomZoneSetJSON::ToJson(expected));
CustomZoneSetData zoneSetData{ L"name", CustomLayoutType::Canvas, info };
JSONHelpers::CustomZoneSetJSON expected{ uuid.get(), zoneSetData };
JSONHelpers::TCustomZoneSetsMap customZoneSets;
customZoneSets.insert(std::make_pair(uuid.get(), zoneSetData));
JSONHelpers::SerializeCustomZoneSetsToTmpFile(customZoneSets, m_path);
Assert::IsTrue(std::filesystem::exists(m_path));
FancyZonesDataInstance().ParseCustomZoneSetFromTmpFile(m_path);
FancyZonesDataInstance().ParseCustomZoneSetsFromTmpFile(m_path);
//test
const int spacing = 10;
@@ -1083,9 +1093,14 @@ namespace FancyZonesUnitTests
//prepare device data
{
const std::wstring zoneUuid = L"default_device_id";
JSONHelpers::DeviceInfoJSON deviceInfo{ zoneUuid, DeviceInfoData{ ZoneSetData{ L"uuid", ZoneSetLayoutType::Custom }, true, 16, 3 } };
JSONHelpers::TDeviceInfoMap deviceInfoMap;
deviceInfoMap.insert(std::make_pair(zoneUuid, DeviceInfoData{ ZoneSetData{ L"uuid", ZoneSetLayoutType::Custom }, true, 16, 3 }));
GUID virtualDesktopId{};
Assert::IsTrue(VirtualDesktopUtils::GetCurrentVirtualDesktopId(&virtualDesktopId), L"Cannot create virtual desktop id");
const std::wstring deviceInfoPath = FancyZonesDataInstance().zonesSettingsFileName + L".device_info_tmp";
JSONHelpers::SerializeDeviceInfoToTmpFile(deviceInfo, deviceInfoPath);
JSONHelpers::SerializeDeviceInfoToTmpFile(deviceInfoMap, virtualDesktopId, deviceInfoPath);
FancyZonesDataInstance().ParseDeviceInfoFromTmpFile(deviceInfoPath);
std::filesystem::remove(deviceInfoPath);
@@ -1100,10 +1115,14 @@ namespace FancyZonesUnitTests
.rowsPercents = { 10000 },
.columnsPercents = { 2500, 5000, 2500 },
.cellChildMap = { { 0, 1, 2 } } }));
JSONHelpers::CustomZoneSetJSON expected{ uuid.get(), CustomZoneSetData{ L"name", CustomLayoutType::Grid, grid } };
json::to_file(m_path, JSONHelpers::CustomZoneSetJSON::ToJson(expected));
CustomZoneSetData zoneSetData{ L"name", CustomLayoutType::Grid, grid };
JSONHelpers::CustomZoneSetJSON expected{ uuid.get(), zoneSetData };
JSONHelpers::TCustomZoneSetsMap customZoneSets;
customZoneSets.insert(std::make_pair(uuid.get(), zoneSetData));
JSONHelpers::SerializeCustomZoneSetsToTmpFile(customZoneSets, m_path);
Assert::IsTrue(std::filesystem::exists(m_path));
FancyZonesDataInstance().ParseCustomZoneSetFromTmpFile(m_path);
FancyZonesDataInstance().ParseCustomZoneSetsFromTmpFile(m_path);
const int spacing = 10;
const int zoneCount = grid.rows() * grid.columns();

View File

@@ -69,7 +69,8 @@ namespace FancyZonesUnitTests
HINSTANCE m_hInst{};
HMONITOR m_monitor{};
MONITORINFO m_monitorInfo{};
MONITORINFOEX m_monitorInfo{};
GUID m_virtualDesktopGuid{};
FancyZonesData& m_fancyZonesData = FancyZonesDataInstance();
@@ -102,6 +103,10 @@ namespace FancyZonesUnitTests
m_fancyZonesData.SetSettingsModulePath(L"FancyZonesUnitTests");
m_fancyZonesData.clear_data();
auto guid = Helpers::StringToGuid(L"{39B25DD2-130D-4B5D-8851-4791D66B1539}");
Assert::IsTrue(guid.has_value());
m_virtualDesktopGuid = *guid;
}
TEST_METHOD_CLEANUP(Cleanup)
@@ -154,7 +159,7 @@ namespace FancyZonesUnitTests
TEST_METHOD(CreateZoneWindowNoDeviceId)
{
// Generate unique id without device id
std::wstring uniqueId = ZoneWindowUtils::GenerateUniqueId(m_monitor, {}, m_virtualDesktopId);
std::wstring uniqueId = FancyZonesUtils::GenerateUniqueId(m_monitor, {}, m_virtualDesktopId);
auto zoneWindow = MakeZoneWindow(winrt::make_self<MockZoneWindowHost>().get(), m_hInst, m_monitor, uniqueId, {});
const std::wstring expectedWorkArea = std::to_wstring(m_monitorInfo.rcMonitor.right) + L"_" + std::to_wstring(m_monitorInfo.rcMonitor.bottom);
@@ -172,7 +177,7 @@ namespace FancyZonesUnitTests
TEST_METHOD(CreateZoneWindowNoDesktopId)
{
// Generate unique id without virtual desktop id
std::wstring uniqueId = ZoneWindowUtils::GenerateUniqueId(m_monitor, m_deviceId, {});
std::wstring uniqueId = FancyZonesUtils::GenerateUniqueId(m_monitor, m_deviceId, {});
auto zoneWindow = MakeZoneWindow(winrt::make_self<MockZoneWindowHost>().get(), m_hInst, m_monitor, uniqueId, {});
const std::wstring expectedWorkArea = std::to_wstring(m_monitorInfo.rcMonitor.right) + L"_" + std::to_wstring(m_monitorInfo.rcMonitor.bottom);
@@ -219,9 +224,9 @@ namespace FancyZonesUnitTests
const ZoneSetLayoutType type = ZoneSetLayoutType::Custom;
const auto expectedZoneSet = ZoneSetData{ Helpers::CreateGuidString(), type };
const auto data = DeviceInfoData{ expectedZoneSet, true, 16, 3 };
const auto deviceInfo = JSONHelpers::DeviceInfoJSON{ m_uniqueId.str(), data };
const auto json = JSONHelpers::DeviceInfoJSON::ToJson(deviceInfo);
json::to_file(activeZoneSetTempPath, json);
JSONHelpers::TDeviceInfoMap deviceInfoMap;
deviceInfoMap.insert(std::make_pair(m_uniqueId.str(), data));
JSONHelpers::SerializeDeviceInfoToTmpFile(deviceInfoMap, m_virtualDesktopGuid, activeZoneSetTempPath);
m_fancyZonesData.ParseDeviceInfoFromTmpFile(activeZoneSetTempPath);
@@ -248,18 +253,20 @@ namespace FancyZonesUnitTests
const auto customSetGuid = Helpers::CreateGuidString();
const auto expectedZoneSet = ZoneSetData{ customSetGuid, type };
const auto data = DeviceInfoData{ expectedZoneSet, true, 16, 3 };
const auto deviceInfo = JSONHelpers::DeviceInfoJSON{ m_uniqueId.str(), data };
const auto json = JSONHelpers::DeviceInfoJSON::ToJson(deviceInfo);
json::to_file(activeZoneSetTempPath, json);
JSONHelpers::TDeviceInfoMap deviceInfoMap;
deviceInfoMap.insert(std::make_pair(m_uniqueId.str(), data));
JSONHelpers::SerializeDeviceInfoToTmpFile(deviceInfoMap, m_virtualDesktopGuid, activeZoneSetTempPath);
const auto info = CanvasLayoutInfo{
100, 100, std::vector{ CanvasLayoutInfo::Rect{ 0, 0, 100, 100 } }
};
const auto customZoneData = CustomZoneSetData{ L"name", CustomLayoutType::Canvas, info };
auto customZoneJson = JSONHelpers::CustomZoneSetJSON::ToJson(JSONHelpers::CustomZoneSetJSON{ customSetGuid, customZoneData });
json::to_file(appliedZoneSetTempPath, customZoneJson);
JSONHelpers::TCustomZoneSetsMap customZoneSets;
customZoneSets.insert(std::make_pair(customSetGuid, customZoneData));
JSONHelpers::SerializeCustomZoneSetsToTmpFile(customZoneSets, appliedZoneSetTempPath);
m_fancyZonesData.ParseDeviceInfoFromTmpFile(activeZoneSetTempPath);
m_fancyZonesData.ParseCustomZoneSetFromTmpFile(appliedZoneSetTempPath);
m_fancyZonesData.ParseCustomZoneSetsFromTmpFile(appliedZoneSetTempPath);
//temp file read on initialization
auto actual = MakeZoneWindow(winrt::make_self<MockZoneWindowHost>().get(), m_hInst, m_monitor, m_uniqueId.str(), {});
@@ -285,9 +292,9 @@ namespace FancyZonesUnitTests
const auto customSetGuid = Helpers::CreateGuidString();
const auto expectedZoneSet = ZoneSetData{ customSetGuid, type };
const auto data = DeviceInfoData{ expectedZoneSet, true, 16, 3 };
const auto deviceInfo = JSONHelpers::DeviceInfoJSON{ m_uniqueId.str(), data };
const auto json = JSONHelpers::DeviceInfoJSON::ToJson(deviceInfo);
json::to_file(activeZoneSetTempPath, json);
JSONHelpers::TDeviceInfoMap deviceInfoMap;
deviceInfoMap.insert(std::make_pair(m_uniqueId.str(), data));
JSONHelpers::SerializeDeviceInfoToTmpFile(deviceInfoMap, m_virtualDesktopGuid, activeZoneSetTempPath);
const auto info = CanvasLayoutInfo{
100, 100, std::vector{ CanvasLayoutInfo::Rect{ 0, 0, 100, 100 } }
@@ -295,7 +302,9 @@ namespace FancyZonesUnitTests
const auto customZoneData = CustomZoneSetData{ L"name", CustomLayoutType::Canvas, info };
const auto customZoneSet = JSONHelpers::CustomZoneSetJSON{ customSetGuid, customZoneData };
auto customZoneJson = JSONHelpers::CustomZoneSetJSON::ToJson(customZoneSet);
json::to_file(appliedZoneSetTempPath, customZoneJson);
JSONHelpers::TCustomZoneSetsMap customZoneSets;
customZoneSets.insert(std::make_pair(customSetGuid, customZoneData));
JSONHelpers::SerializeCustomZoneSetsToTmpFile(customZoneSets, appliedZoneSetTempPath);
//save same zone as deleted
json::JsonObject deletedCustomZoneSets = {};
@@ -306,7 +315,7 @@ namespace FancyZonesUnitTests
m_fancyZonesData.ParseDeviceInfoFromTmpFile(activeZoneSetTempPath);
m_fancyZonesData.ParseDeletedCustomZoneSetsFromTmpFile(deletedZonesTempPath);
m_fancyZonesData.ParseCustomZoneSetFromTmpFile(appliedZoneSetTempPath);
m_fancyZonesData.ParseCustomZoneSetsFromTmpFile(appliedZoneSetTempPath);
//temp file read on initialization
auto actual = MakeZoneWindow(winrt::make_self<MockZoneWindowHost>().get(), m_hInst, m_monitor, m_uniqueId.str(), {});
@@ -331,9 +340,9 @@ namespace FancyZonesUnitTests
const auto customSetGuid = Helpers::CreateGuidString();
const auto expectedZoneSet = ZoneSetData{ customSetGuid, type };
const auto data = DeviceInfoData{ expectedZoneSet, true, 16, 3 };
const auto deviceInfo = JSONHelpers::DeviceInfoJSON{ m_uniqueId.str(), data };
const auto json = JSONHelpers::DeviceInfoJSON::ToJson(deviceInfo);
json::to_file(activeZoneSetTempPath, json);
JSONHelpers::TDeviceInfoMap deviceInfoMap;
deviceInfoMap.insert(std::make_pair(m_uniqueId.str(), data));
JSONHelpers::SerializeDeviceInfoToTmpFile(deviceInfoMap, m_virtualDesktopGuid, activeZoneSetTempPath);
const auto info = CanvasLayoutInfo{
100, 100, std::vector{ CanvasLayoutInfo::Rect{ 0, 0, 100, 100 } }
@@ -341,7 +350,9 @@ namespace FancyZonesUnitTests
const auto customZoneData = CustomZoneSetData{ L"name", CustomLayoutType::Canvas, info };
const auto customZoneSet = JSONHelpers::CustomZoneSetJSON{ customSetGuid, customZoneData };
auto customZoneJson = JSONHelpers::CustomZoneSetJSON::ToJson(customZoneSet);
json::to_file(appliedZoneSetTempPath, customZoneJson);
JSONHelpers::TCustomZoneSetsMap customZoneSets;
customZoneSets.insert(std::make_pair(customSetGuid, customZoneData));
JSONHelpers::SerializeCustomZoneSetsToTmpFile(customZoneSets, appliedZoneSetTempPath);
//save different zone as deleted
json::JsonObject deletedCustomZoneSets = {};
@@ -353,7 +364,7 @@ namespace FancyZonesUnitTests
m_fancyZonesData.ParseDeviceInfoFromTmpFile(activeZoneSetTempPath);
m_fancyZonesData.ParseDeletedCustomZoneSetsFromTmpFile(deletedZonesTempPath);
m_fancyZonesData.ParseCustomZoneSetFromTmpFile(appliedZoneSetTempPath);
m_fancyZonesData.ParseCustomZoneSetsFromTmpFile(appliedZoneSetTempPath);
//temp file read on initialization
auto actual = MakeZoneWindow(winrt::make_self<MockZoneWindowHost>().get(), m_hInst, m_monitor, m_uniqueId.str(), {});