mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-06 11:16:51 +02:00
[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:
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -57,6 +57,7 @@ namespace Helpers
|
||||
{
|
||||
std::wstring GuidToString(const GUID& guid);
|
||||
std::wstring CreateGuidString();
|
||||
std::optional<GUID> StringToGuid(const std::wstring& str);
|
||||
}
|
||||
|
||||
template<>
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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(), {});
|
||||
|
||||
Reference in New Issue
Block a user