841 lines
37 KiB
C++
Raw Normal View History

#include "pch.h"
#include <common/SettingsAPI/settings_objects.h>
#include "version/helper.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
using namespace PowerToysSettings;
namespace UnitTestsCommonLib
{
2019-12-12 20:24:00 +03:00
void compareJsons(const json::JsonObject& expected, const json::JsonObject& actual, bool recursive = true)
{
auto iter = expected.First();
while (iter.HasCurrent())
{
const auto key = iter.Current().Key();
Assert::IsTrue(actual.HasKey(key));
const std::wstring expectedStringified = iter.Current().Value().Stringify().c_str();
const std::wstring actualStringified = actual.GetNamedValue(key).Stringify().c_str();
if (recursive)
{
json::JsonObject expectedJson;
if (json::JsonObject::TryParse(expectedStringified, expectedJson))
{
json::JsonObject actualJson;
if (json::JsonObject::TryParse(actualStringified, actualJson))
{
compareJsons(expectedJson, actualJson, true);
}
else
{
Assert::IsTrue(false);
}
}
else
{
Assert::AreEqual(expectedStringified, actualStringified);
}
}
else
{
Assert::AreEqual(expectedStringified, actualStringified);
}
iter.MoveNext();
}
}
TEST_CLASS (PowerToyValuesUnitTests)
{
2019-12-10 10:28:24 +03:00
private:
const std::wstring m_json = L"{\"name\":\"Module Name\",\"properties\" : {\"bool_toggle_true\":{\"value\":true},\"bool_toggle_false\":{\"value\":false},\"color_picker\" : {\"value\":\"#ff8d12\"},\"int_spinner\" : {\"value\":10},\"string_text\" : {\"value\":\"a quick fox\"}},\"version\" : \"1.0\" }";
2019-12-12 20:24:00 +03:00
const std::wstring m_moduleName = L"Module Name";
const std::wstring m_moduleKey = L"Module Key";
2019-12-10 10:28:24 +03:00
public:
TEST_METHOD (LoadFromJsonBoolTrue)
2019-12-10 10:28:24 +03:00
{
PowerToyValues values = PowerToyValues::from_json_string(m_json, m_moduleKey);
2019-12-10 10:28:24 +03:00
auto value = values.get_bool_value(L"bool_toggle_true");
Assert::IsTrue(value.has_value());
Assert::AreEqual(true, *value);
}
TEST_METHOD (LoadFromJsonBoolFalse)
2019-12-10 10:28:24 +03:00
{
PowerToyValues values = PowerToyValues::from_json_string(m_json, m_moduleKey);
2019-12-10 10:28:24 +03:00
auto value = values.get_bool_value(L"bool_toggle_false");
Assert::IsTrue(value.has_value());
Assert::AreEqual(false, *value);
}
TEST_METHOD (LoadFromJsonInt)
2019-12-10 10:28:24 +03:00
{
PowerToyValues values = PowerToyValues::from_json_string(m_json, m_moduleKey);
2019-12-10 10:28:24 +03:00
auto value = values.get_int_value(L"int_spinner");
Assert::IsTrue(value.has_value());
Assert::AreEqual(10, *value);
}
TEST_METHOD (LoadFromJsonString)
2019-12-10 10:28:24 +03:00
{
PowerToyValues values = PowerToyValues::from_json_string(m_json, m_moduleKey);
2019-12-10 10:28:24 +03:00
auto value = values.get_string_value(L"string_text");
Assert::IsTrue(value.has_value());
std::wstring expected = L"a quick fox";
Assert::AreEqual(expected, *value);
}
TEST_METHOD (LoadFromJsonColorPicker)
2019-12-10 10:28:24 +03:00
{
PowerToyValues values = PowerToyValues::from_json_string(m_json, m_moduleKey);
2019-12-10 10:28:24 +03:00
auto value = values.get_string_value(L"color_picker");
Assert::IsTrue(value.has_value());
std::wstring expected = L"#ff8d12";
Assert::AreEqual(expected, *value);
}
2019-12-12 20:24:00 +03:00
TEST_METHOD (LoadFromEmptyString)
2019-12-12 20:24:00 +03:00
{
auto func = [] { PowerToyValues values = PowerToyValues::from_json_string(L"", L"Module Key"); };
2019-12-12 20:24:00 +03:00
Assert::ExpectException<winrt::hresult_error>(func);
}
TEST_METHOD (LoadFromInvalidString_NameMissed)
2019-12-12 20:24:00 +03:00
{
auto func = [] { PowerToyValues values = PowerToyValues::from_json_string(L"{\"properties\" : {\"bool_toggle_true\":{\"value\":true},\"bool_toggle_false\":{\"value\":false},\"color_picker\" : {\"value\":\"#ff8d12\"},\"int_spinner\" : {\"value\":10},\"string_text\" : {\"value\":\"a quick fox\"}},\"version\" : \"1.0\" }", L"Module Key"); };
2019-12-12 20:24:00 +03:00
Assert::ExpectException<winrt::hresult_error>(func);
}
TEST_METHOD (LoadFromInvalidString_VersionMissed)
2019-12-12 20:24:00 +03:00
{
PowerToyValues values = PowerToyValues::from_json_string(L"{\"name\":\"Module Name\",\"properties\" : {}}", L"Module Key");
2019-12-12 20:24:00 +03:00
const std::wstring expectedStr = L"{\"name\" : \"Module Name\", \"properties\" : {},\"version\" : \"1.0\"}";
const auto expected = json::JsonObject::Parse(expectedStr);
const auto actual = json::JsonObject::Parse(values.serialize());
compareJsons(expected, actual);
}
TEST_METHOD (LoadFromInvalidString_PropertiesMissed)
2019-12-12 20:24:00 +03:00
{
PowerToyValues values = PowerToyValues::from_json_string(L"{\"name\":\"Module Name\",\"version\" : \"1.0\" }", L"Module Key");
2019-12-12 20:24:00 +03:00
const std::wstring expectedStr = L"{\"name\":\"Module Name\",\"version\" : \"1.0\" }";
const auto expected = json::JsonObject::Parse(expectedStr);
const auto actual = json::JsonObject::Parse(values.serialize());
compareJsons(expected, actual);
}
TEST_METHOD (LoadFromValidString_EmptyProperties)
2019-12-12 20:24:00 +03:00
{
PowerToyValues values = PowerToyValues::from_json_string(L"{\"name\":\"Module Name\",\"properties\" : {}, \"version\" : \"1.0\" }", L"Module Key");
2019-12-12 20:24:00 +03:00
const std::wstring expectedStr = L"{\"name\":\"Module Name\",\"properties\" : {},\"version\" : \"1.0\" }";
const auto expected = json::JsonObject::Parse(expectedStr);
const auto actual = json::JsonObject::Parse(values.serialize());
compareJsons(expected, actual);
}
TEST_METHOD (LoadFromValidString_ChangedVersion)
2019-12-12 20:24:00 +03:00
{
PowerToyValues values = PowerToyValues::from_json_string(L"{\"name\":\"Module Name\",\"properties\" : {},\"version\" : \"2.0\"}", L"Module Key");
2019-12-12 20:24:00 +03:00
const std::wstring expectedStr = L"{\"name\" : \"Module Name\", \"properties\" : {},\"version\" : \"1.0\"}"; //version from input json is ignored
const auto expected = json::JsonObject::Parse(expectedStr);
const auto actual = json::JsonObject::Parse(values.serialize());
compareJsons(expected, actual);
}
TEST_METHOD (CreateWithName)
2019-12-12 20:24:00 +03:00
{
PowerToyValues values(m_moduleName, m_moduleKey);
2019-12-12 20:24:00 +03:00
const std::wstring expectedStr = L"{\"name\":\"Module Name\",\"properties\" : {},\"version\" : \"1.0\" }";
const auto expected = json::JsonObject::Parse(expectedStr);
const auto actual = json::JsonObject::Parse(values.serialize());
compareJsons(expected, actual);
}
TEST_METHOD (AddPropertyBoolPositive)
2019-12-12 20:24:00 +03:00
{
PowerToyValues values(m_moduleName, m_moduleKey);
2019-12-12 20:24:00 +03:00
values.add_property<bool>(L"positive_bool_value", true);
auto value = values.get_bool_value(L"positive_bool_value");
Assert::IsTrue(value.has_value());
Assert::AreEqual(true, *value);
}
TEST_METHOD (AddPropertyBoolNegative)
2019-12-12 20:24:00 +03:00
{
PowerToyValues values(m_moduleName, m_moduleKey);
2019-12-12 20:24:00 +03:00
values.add_property<bool>(L"negative_bool_value", false);
auto value = values.get_bool_value(L"negative_bool_value");
Assert::IsTrue(value.has_value());
Assert::AreEqual(false, *value);
}
TEST_METHOD (AddPropertyIntPositive)
2019-12-12 20:24:00 +03:00
{
PowerToyValues values(m_moduleName, m_moduleKey);
2019-12-12 20:24:00 +03:00
const int intVal = 4392854;
values.add_property<int>(L"integer", intVal);
auto value = values.get_int_value(L"integer");
Assert::IsTrue(value.has_value());
Assert::AreEqual(intVal, *value);
}
TEST_METHOD (AddPropertyIntNegative)
2019-12-12 20:24:00 +03:00
{
PowerToyValues values(m_moduleName, m_moduleKey);
2019-12-12 20:24:00 +03:00
const int intVal = -4392854;
values.add_property<int>(L"integer", intVal);
auto value = values.get_int_value(L"integer");
Assert::IsTrue(value.has_value());
Assert::AreEqual(intVal, *value);
}
TEST_METHOD (AddPropertyIntZero)
2019-12-12 20:24:00 +03:00
{
PowerToyValues values(m_moduleName, m_moduleKey);
2019-12-12 20:24:00 +03:00
const int intVal = 0;
values.add_property<int>(L"integer", intVal);
auto value = values.get_int_value(L"integer");
Assert::IsTrue(value.has_value());
Assert::AreEqual(intVal, *value);
}
TEST_METHOD (AddPropertyStringEmpty)
2019-12-12 20:24:00 +03:00
{
PowerToyValues values(m_moduleName, m_moduleKey);
2019-12-12 20:24:00 +03:00
const std::wstring stringVal = L"";
values.add_property<std::wstring>(L"stringval", stringVal);
auto value = values.get_string_value(L"stringval");
Assert::IsTrue(value.has_value());
Assert::AreEqual(stringVal, *value);
}
TEST_METHOD (AddPropertyString)
2019-12-12 20:24:00 +03:00
{
PowerToyValues values(m_moduleName, m_moduleKey);
2019-12-12 20:24:00 +03:00
const std::wstring stringVal = L"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
values.add_property<std::wstring>(L"stringval", stringVal);
auto value = values.get_string_value(L"stringval");
Assert::IsTrue(value.has_value());
Assert::AreEqual(stringVal, *value);
}
TEST_METHOD (AddPropertyJsonEmpty)
2019-12-12 20:24:00 +03:00
{
PowerToyValues values(m_moduleName, m_moduleKey);
2019-12-12 20:24:00 +03:00
const auto json = json::JsonObject();
values.add_property<json::JsonObject>(L"jsonval", json);
auto value = values.get_json(L"jsonval");
Assert::IsTrue(value.has_value());
compareJsons(json, *value);
}
TEST_METHOD (AddPropertyJsonObject)
2019-12-12 20:24:00 +03:00
{
PowerToyValues values(m_moduleName, m_moduleKey);
2019-12-12 20:24:00 +03:00
const auto json = json::JsonObject::Parse(m_json);
values.add_property<json::JsonObject>(L"jsonval", json);
auto value = values.get_json(L"jsonval");
Assert::IsTrue(value.has_value());
compareJsons(json, *value);
}
};
TEST_CLASS (SettingsUnitTests)
2019-12-12 20:24:00 +03:00
{
private:
const std::wstring m_moduleName = L"Module Name";
const std::wstring m_defaultSettingsName = L"Default setting name";
const std::wstring m_defaultSettingsDescription = L"Default setting description";
const json::JsonObject m_defaultSettingsJson = json::JsonObject::Parse(L"{\"name\" : \"Module Name\", \"properties\" : {},\"version\" : \"1.0\"}");
json::JsonObject createSettingsProperties(const std::wstring& editorType)
{
json::JsonObject properties = json::JsonObject();
properties.SetNamedValue(L"display_name", json::JsonValue::CreateStringValue(m_defaultSettingsDescription));
properties.SetNamedValue(L"editor_type", json::JsonValue::CreateStringValue(editorType));
properties.SetNamedValue(L"order", json::JsonValue::CreateNumberValue(1));
return properties;
}
public:
TEST_METHOD (SettingsSerialization)
2019-12-12 20:24:00 +03:00
{
Settings settings(nullptr, m_moduleName);
const auto expected = m_defaultSettingsJson;
const auto actual = json::JsonObject::Parse(settings.serialize());
compareJsons(expected, actual);
}
TEST_METHOD (SettingsSerializationToBuffer)
2019-12-12 20:24:00 +03:00
{
Settings settings(nullptr, m_moduleName);
const auto expected = m_defaultSettingsJson;
int expectedSize = expected.Stringify().size() + 1;
int actualSize = expectedSize;
wchar_t* buffer = new wchar_t[expectedSize];
bool serializationSuccess = settings.serialize_to_buffer(buffer, &actualSize);
2019-12-12 20:24:00 +03:00
Assert::IsTrue(serializationSuccess);
2019-12-12 20:24:00 +03:00
Assert::AreEqual(expectedSize, actualSize);
auto actualJson = json::JsonObject::Parse(std::wstring(buffer));
compareJsons(m_defaultSettingsJson, actualJson);
}
TEST_METHOD (SettingsSetDescription)
2019-12-12 20:24:00 +03:00
{
const auto value = L"description value";
Settings settings(nullptr, m_moduleName);
settings.set_description(value);
const auto expected = m_defaultSettingsJson;
expected.SetNamedValue(L"description", json::JsonValue::CreateStringValue(value));
const auto actual = json::JsonObject::Parse(settings.serialize());
compareJsons(expected, actual);
}
TEST_METHOD (SettingsSetIconKey)
2019-12-12 20:24:00 +03:00
{
const auto value = L"icon key";
Settings settings(nullptr, m_moduleName);
settings.set_icon_key(value);
const auto expected = m_defaultSettingsJson;
expected.SetNamedValue(L"icon_key", json::JsonValue::CreateStringValue(value));
const auto actual = json::JsonObject::Parse(settings.serialize());
compareJsons(expected, actual);
}
TEST_METHOD (SettingsSetOverviewLink)
2019-12-12 20:24:00 +03:00
{
const auto value = L"overview link";
Settings settings(nullptr, m_moduleName);
settings.set_overview_link(value);
const auto expected = m_defaultSettingsJson;
expected.SetNamedValue(L"overview_link", json::JsonValue::CreateStringValue(value));
const auto actual = json::JsonObject::Parse(settings.serialize());
compareJsons(expected, actual);
}
TEST_METHOD (SettingsSetVideoLink)
2019-12-12 20:24:00 +03:00
{
const auto value = L"video link";
Settings settings(nullptr, m_moduleName);
settings.set_video_link(value);
const auto expected = m_defaultSettingsJson;
expected.SetNamedValue(L"video_link", json::JsonValue::CreateStringValue(value));
const auto actual = json::JsonObject::Parse(settings.serialize());
compareJsons(expected, actual);
}
TEST_METHOD (SettingsAddBoolTogglePositive)
2019-12-12 20:24:00 +03:00
{
const auto value = true;
Settings settings(nullptr, m_moduleName);
2020-05-26 14:12:20 -04:00
settings.add_bool_toggle(m_defaultSettingsName, m_defaultSettingsDescription, value);
2019-12-12 20:24:00 +03:00
auto expected = m_defaultSettingsJson;
auto expectedProperties = createSettingsProperties(L"bool_toggle");
expectedProperties.SetNamedValue(L"value", json::JsonValue::CreateBooleanValue(value));
expected.GetNamedObject(L"properties").SetNamedValue(m_defaultSettingsName, expectedProperties);
const auto actual = json::JsonObject::Parse(settings.serialize());
compareJsons(expected, actual);
}
TEST_METHOD (SettingsAddBoolToggleNegative)
2019-12-12 20:24:00 +03:00
{
const auto value = false;
Settings settings(nullptr, m_moduleName);
2020-05-26 14:12:20 -04:00
settings.add_bool_toggle(m_defaultSettingsName, m_defaultSettingsDescription, value);
2019-12-12 20:24:00 +03:00
auto expected = m_defaultSettingsJson;
auto expectedProperties = createSettingsProperties(L"bool_toggle");
expectedProperties.SetNamedValue(L"value", json::JsonValue::CreateBooleanValue(value));
expected.GetNamedObject(L"properties").SetNamedValue(m_defaultSettingsName, expectedProperties);
const auto actual = json::JsonObject::Parse(settings.serialize());
compareJsons(expected, actual);
}
TEST_METHOD (SettingsAddSpinner)
2019-12-12 20:24:00 +03:00
{
const int value = 738543;
const int min = 0;
const int max = 1000000;
const int step = 10;
Settings settings(nullptr, m_moduleName);
settings.add_int_spinner(m_defaultSettingsName, m_defaultSettingsDescription, value, min, max, step);
auto expected = m_defaultSettingsJson;
auto expectedProperties = createSettingsProperties(L"int_spinner");
expectedProperties.SetNamedValue(L"value", json::JsonValue::CreateNumberValue(value));
expectedProperties.SetNamedValue(L"min", json::JsonValue::CreateNumberValue(min));
expectedProperties.SetNamedValue(L"max", json::JsonValue::CreateNumberValue(max));
expectedProperties.SetNamedValue(L"step", json::JsonValue::CreateNumberValue(step));
expected.GetNamedObject(L"properties").SetNamedValue(m_defaultSettingsName, expectedProperties);
const auto actual = json::JsonObject::Parse(settings.serialize());
compareJsons(expected, actual);
}
TEST_METHOD (SettingsAddString)
2019-12-12 20:24:00 +03:00
{
const auto value = L"string text ";
Settings settings(nullptr, m_moduleName);
settings.add_string(m_defaultSettingsName, m_defaultSettingsDescription, value);
auto expected = m_defaultSettingsJson;
auto expectedProperties = createSettingsProperties(L"string_text");
expectedProperties.SetNamedValue(L"value", json::JsonValue::CreateStringValue(value));
expected.GetNamedObject(L"properties").SetNamedValue(m_defaultSettingsName, expectedProperties);
const auto actual = json::JsonObject::Parse(settings.serialize());
compareJsons(expected, actual);
}
[0.16]: Merge Preview Handlers in Master (#1516) * Added project template for common library * Added reference to stylecop.json * Fixed xml documetation file path for common project * Added reference to stylecop.json * Added COM interface interpolations to C# * Changed namespace to Common * Added xml doc to com interfaces * Removed AnyCPU configuration from solution file * Added Preview Hander and form User Control Implementation * Fix stylecop warnings * Added test control and handler * Added Xaml description for preview handler * Added Xml documenatation * Updated the control to form * Added registration and unregistration logic for the handler * Moved the files in separate folder and fix PR comments * updated the name of previewhandler class to base class * Added the DoPreview to PreviewHandlerControl Interface * Modified the Dopreview and Unload as virtual method * Uncommented the DocumentText to help bug repro * HTML Parsing Extension for preview pane markdown renderer (#1108) * Added Extension for html post processing * Added unit test poroject for preview pane * Added pipline test and base test function * Added Tests for extension * Added tests for url slashes * Added tests for url and figure caption * Markdown preview pane (#1128) * Added Extension for html post processing * Added unit test poroject for preview pane * Added pipline test and base test function * Added Tests for extension * Added handler and control for markdown * Tests added * Locally working version for markdown * Working image relative url's in markdown * Added CSS to preview display * Updates CSS for code block * Removed html file write comment in markdown control * Updated assembly version and web browser control test * Add Svg preview handler (#1129) * Added a new project for Svg preview handler * Added initial implementation of Svg Preview Handler * Fixed output path * Added Unit Test Project * Added StreamWrapper and Update Svg Control * Updated Svg Handler Guid * Removed migration backup folder * Removed Fluent Assertions NuGet * Added Comments for StreamWrapper * Removed the manual GC collect * Added unit tests for Svg preview Handler * Updated the xml doc for stream wrapper * User/lamotile/add_powerpreviewsettings (#1075) * Added powersettings to PowerToys Settings UI * added settings library * updated settings-web * updated project oncfiguration * updated project onfiguration * updated project .sln file * removed .etl file and added it to git-ignore * separated the PowerPreviewModule into split classes .cpp and .h * moved PowerPreviewModule implemnetations to .cpp file * fixed StringTable formatter * fixed spacing in resource.h * added m_ to member varibales * initiliaze m_isPreviewEnabled in the base class * removed duplication of objects by using pass by refference and std::move * made the getters const * updated naming convention * Split test calsses * Add const string * Replaced move with const string * Made attributes private * Made attributes private * removed unused constructor * Update resource.h formatted resource.h * Adding unit tests for preview handler common (#1156) * Changed the name of the Common library to PreviewHandlerCommon * Added unit tests project for PreviewHandlerCommon * Updated ComInterop accessor type * Added unit tests for PreviewHandlerbase * Added tests for file and stream based handler * Added unit tests for StreamWrapper * Added form handler unit tests * Added Unit tests for FormHandlerControl * Added file header * Add Powerpreview project * Add spacing in sln file * swapped string refferences (#1199) * added registry methods and enable/disable preview handlers (#1230) * added registry methods and enable/disable preview handlers * formatted .rc file. * formatted resource file * formatted .rc file. * formatted settings.cpp * formatted settings.h * formatted SVGPreviewSettingsClassTest.cpp * Formatted MarkDownPreviewSettingsClassTest.cpp * using wide strings * formatted settings.h * FileExplorerPreviewSettingsTest.cpp formatting * fixed typo and formatting * closing Registry and fixing typos * formmarted code using ctrl+k+d * fixed naming * fixed typo * changed if/else reverse order * Markdown preview pane (#1220) * Added rich text bar for information display * Added infobar * Added tests for extension and markdown control * Added xml docstring for markdown preview handler control * Updated assembly file for markdown preview pane * Updated removal of script tag without modifying CSS * Added info bar text string to resource file. * Removed error with infobar display on first rendering * Updated assembly version * Remove script and image element from Svg (#1231) * Added implementation to remove script and image tag * Added Unit tests for SvgPreviewHandlerHelper * Updated Unit tests for SvgPreviewControl * Moved the hardcoded string to resource file * Changed the LocalMachine to CurrentUser for preview handler registration * Added unit tests for multiple blocked elements tags * User/lamotile/update settings objects (#1263) * added registry methods and enable/disable preview handlers * formatted .rc file. * formatted resource file * formatted .rc file. * formatted settings.cpp * formatted settings.h * formatted SVGPreviewSettingsClassTest.cpp * Formatted MarkDownPreviewSettingsClassTest.cpp * using wide strings * formatted settings.h * FileExplorerPreviewSettingsTest.cpp formatting * fixed typo and formatting * closing Registry and fixing typos * formmarted code using ctrl+k+d * fixed naming * fixed typo * changed if/else reverse order * updated setiings_objects.cpp * removed changes on files that are not part of this PR * removed const ref on primative types * updated pass by ref semantic and removed pas by reff on primative types * fixed spaces in the commas * fixed spaces in brackets * Preview pane telemetry (#1299) * Added telemetry base class and markdown telemetry class * Updated docstring for telemetry event. * Added telemetry to markdown for error * Added try catch for markdown preview handler and display error bar * Updated markdown telemetry to make event names global variable * Updated parameter name to camel casing and telemetry event name naming. * Corrected assembbly version for svg renderer * Markdown Image files display (#1303) * Added telemetry base class and markdown telemetry class * Updated docstring for telemetry event. * Added telemetry to markdown for error * Added try catch for markdown preview handler and display error bar * Updated markdown telemetry to make event names global variable * Updated Markdown preview to display without vertical scrollbar and removed xml doc to html agility pack. * Updated parameter name to camel casing and telemetry event name naming. * Corrected assembbly version for svg renderer * Removed duplicate function * Add telemetry for Svg preview handler (#1314) * Added telemetry events for Svg Preview Handler * Added unit test in case preview handler throws * Updated the Error event name * Remove the not required return statement * User/lamotile/add read me (#1332) * add readme * moved images * re-added images' * Fixed gramma * Update figure number refference * improve preview handler intergration (#1319) * improve preview handler intergration * Fixed typo * updated typo * updated enable() function * updated is enabled() * re-updated is enabled() * added this-> key word * (0.16) - Install preview handler with msix (#1339) * Removed the registration logic from preview handlers * Updated the output path * Added logic to shim the activation of .net assembly * Updated manifest file * Fix the allowedsilenttakeover filed in manifest * Updated the appxmanifest file * Added AllowSilentDefaultTakeOver in manifest * Fix returned error code by DllGetClassObject * Moved the CLSID to a common header file * Added info about where CLSID needs to be updated * Added a .reg file for the Keys added in registry.dat * Added comments for DllGetClassObject * Svg Preview Handler block external component (#1368) * Removed the registration logic from preview handlers * Updated the output path * Added logic to shim the activation of .net assembly * Updated manifest file * Fix the allowedsilenttakeover filed in manifest * Updated the appxmanifest file * Added AllowSilentDefaultTakeOver in manifest * Fix returned error code by DllGetClassObject * Moved the CLSID to a common header file * Added info about where CLSID needs to be updated * Added a .reg file for the Keys added in registry.dat * Added comments for DllGetClassObject * Extended WebBrowserSite for setting flags in DISPID_AMBIENT_DLCONTROL * Added XML Documenatation * Removed the logic for deleting image and script element from Svg * Updated Unit Tests * Updated typecast of uint * Forwarded calls to Type.InvokeMember * Resolve PR Comments * Adding MSI Installation for Preview Handler (#1436) * Updated wxs for including dll and registry keys for preview handlers * Changed the casing for registry key * Resolve PR Comments * Added comments for File element * Call GC on preview unloading (#1456) * Call GC collect on preview unloading * Added github issue link * Update Web browser control for Markdown Previewer (#1464) * Updated Webbrowser control * Updated Unit tests * Disabled Navigation for Svg Previewer * Fix power preview unit tests (#1508) * Decoupled registry interaction logic * Updated File explorer settings * Updated unit tests for PowerPreview Settings * Added Asserrtion for Scope of registry key * Updated the registry value to match with installation registry value * Sync master settings.cpp * Merge settings changes from PreviewHandlers * Remove newline changes added into in example_powertoy\trace.cpp * Chaned .net framework to 4.7.2 * Updated Csproj files to auto generate Assembly.info files * Updated msi installer to use version variable for preview handlers assembly * Removed the signing of Assembly and updated wxs to not include PublicKeyToken * Updated the Path in Packaginglayout.xml to modules from Gac and the registry hive binary * Regenerated updated JS and html file * Resolve PR Comments * Readded the wprp file Co-authored-by: Divyansh <divyan@microsoft.com> Co-authored-by: Divyansh <somm14divi@gmail.com> Co-authored-by: Lavius Motileng <58791731+laviusmotileng-ms@users.noreply.github.com>
2020-03-11 15:53:49 -07:00
TEST_METHOD(SettingsAddLargeHeader)
{
const auto value = L"large header sample text ";
Settings settings(nullptr, m_moduleName);
settings.add_header_szLarge(m_defaultSettingsName, m_defaultSettingsDescription, value);
auto expected = m_defaultSettingsJson;
auto expectedProperties = createSettingsProperties(L"header_large");
expectedProperties.SetNamedValue(L"value", json::JsonValue::CreateStringValue(value));
expected.GetNamedObject(L"properties").SetNamedValue(m_defaultSettingsName, expectedProperties);
const auto actual = json::JsonObject::Parse(settings.serialize());
compareJsons(expected, actual);
}
TEST_METHOD(SettingsAddStringMultiline)
2019-12-12 20:24:00 +03:00
{
const auto value = L"Lorem ipsum dolor sit amet,\nconsectetur adipiscing elit,\nsed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\nUt enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\nDuis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident,\nsunt in culpa qui officia deserunt mollit anim id est laborum.";
Settings settings(nullptr, m_moduleName);
settings.add_multiline_string(m_defaultSettingsName, m_defaultSettingsDescription, value);
auto expected = m_defaultSettingsJson;
auto expectedProperties = createSettingsProperties(L"string_text");
expectedProperties.SetNamedValue(L"value", json::JsonValue::CreateStringValue(value));
expectedProperties.SetNamedValue(L"multiline", json::JsonValue::CreateBooleanValue(true));
expected.GetNamedObject(L"properties").SetNamedValue(m_defaultSettingsName, expectedProperties);
const auto actual = json::JsonObject::Parse(settings.serialize());
compareJsons(expected, actual);
}
TEST_METHOD (SettingsAddColorPicker)
2019-12-12 20:24:00 +03:00
{
const auto value = L"#ffffff";
Settings settings(nullptr, m_moduleName);
settings.add_color_picker(m_defaultSettingsName, m_defaultSettingsDescription, value);
auto expected = m_defaultSettingsJson;
auto expectedProperties = createSettingsProperties(L"color_picker");
expectedProperties.SetNamedValue(L"value", json::JsonValue::CreateStringValue(value));
expected.GetNamedObject(L"properties").SetNamedValue(m_defaultSettingsName, expectedProperties);
const auto actual = json::JsonObject::Parse(settings.serialize());
compareJsons(expected, actual);
}
TEST_METHOD (SettingsAddHotkey)
2019-12-12 20:24:00 +03:00
{
const auto value = PowerToysSettings::HotkeyObject::from_settings(true, true, true, true, 0);
Settings settings(nullptr, m_moduleName);
settings.add_hotkey(m_defaultSettingsName, m_defaultSettingsDescription, value);
auto expected = m_defaultSettingsJson;
auto expectedProperties = createSettingsProperties(L"hotkey");
expectedProperties.SetNamedValue(L"value", value.get_json());
expected.GetNamedObject(L"properties").SetNamedValue(m_defaultSettingsName, expectedProperties);
const auto actual = json::JsonObject::Parse(settings.serialize());
compareJsons(expected, actual);
}
TEST_METHOD (SettingsAddChoiceGroup)
2019-12-12 20:24:00 +03:00
{
const auto value = L"choice group value";
const auto keysAndTexts = {
std::make_pair<std::wstring, std::wstring>(L"key1", L"value1"),
std::make_pair<std::wstring, std::wstring>(L"key2", L"value2"),
std::make_pair<std::wstring, std::wstring>(L"key3", L"value3")
};
Settings settings(nullptr, m_moduleName);
settings.add_choice_group(m_defaultSettingsName, m_defaultSettingsDescription, value, keysAndTexts);
auto expected = m_defaultSettingsJson;
auto expectedProperties = createSettingsProperties(L"choice_group");
expectedProperties.SetNamedValue(L"value", json::JsonValue::CreateStringValue(value));
json::JsonArray options;
for (const auto& [key, text] : keysAndTexts)
{
json::JsonObject entry;
entry.SetNamedValue(L"key", json::value(key));
entry.SetNamedValue(L"text", json::value(text));
options.Append(std::move(entry));
}
expectedProperties.SetNamedValue(L"options", std::move(options));
expected.GetNamedObject(L"properties").SetNamedValue(m_defaultSettingsName, expectedProperties);
const auto actual = json::JsonObject::Parse(settings.serialize());
compareJsons(expected, actual);
}
TEST_METHOD (SettingsAddChoiceGroupEmpty)
2019-12-12 20:24:00 +03:00
{
const auto value = L"choice group value";
Settings settings(nullptr, m_moduleName);
settings.add_choice_group(m_defaultSettingsName, m_defaultSettingsDescription, value, {});
auto expected = m_defaultSettingsJson;
auto expectedProperties = createSettingsProperties(L"choice_group");
expectedProperties.SetNamedValue(L"value", json::JsonValue::CreateStringValue(value));
expectedProperties.SetNamedValue(L"options", json::JsonArray());
expected.GetNamedObject(L"properties").SetNamedValue(m_defaultSettingsName, expectedProperties);
const auto actual = json::JsonObject::Parse(settings.serialize());
compareJsons(expected, actual);
}
TEST_METHOD (SettingsAddDropdown)
2019-12-12 20:24:00 +03:00
{
const auto value = L"dropdown value";
const auto keysAndTexts = {
std::make_pair<std::wstring, std::wstring>(L"key1", L"value1"),
std::make_pair<std::wstring, std::wstring>(L"key2", L"value2"),
std::make_pair<std::wstring, std::wstring>(L"key3", L"value3")
};
Settings settings(nullptr, m_moduleName);
settings.add_dropdown(m_defaultSettingsName, m_defaultSettingsDescription, value, keysAndTexts);
auto expected = m_defaultSettingsJson;
auto expectedProperties = createSettingsProperties(L"dropdown");
expectedProperties.SetNamedValue(L"value", json::JsonValue::CreateStringValue(value));
json::JsonArray options;
for (const auto& [key, text] : keysAndTexts)
{
json::JsonObject entry;
entry.SetNamedValue(L"key", json::value(key));
entry.SetNamedValue(L"text", json::value(text));
options.Append(std::move(entry));
}
expectedProperties.SetNamedValue(L"options", std::move(options));
expected.GetNamedObject(L"properties").SetNamedValue(m_defaultSettingsName, expectedProperties);
const auto actual = json::JsonObject::Parse(settings.serialize());
compareJsons(expected, actual);
}
TEST_METHOD (SettingsAddDropdownEmpty)
2019-12-12 20:24:00 +03:00
{
const auto value = L"dropdown value";
Settings settings(nullptr, m_moduleName);
settings.add_dropdown(m_defaultSettingsName, m_defaultSettingsDescription, value, {});
auto expected = m_defaultSettingsJson;
auto expectedProperties = createSettingsProperties(L"dropdown");
expectedProperties.SetNamedValue(L"value", json::JsonValue::CreateStringValue(value));
expected.GetNamedObject(L"properties").SetNamedValue(m_defaultSettingsName, expectedProperties);
const auto actual = json::JsonObject::Parse(settings.serialize());
compareJsons(expected, actual);
}
TEST_METHOD (SettingsAddCustomAction)
2019-12-12 20:24:00 +03:00
{
const auto value = L"custom action value";
const std::wstring buttonText = L"button text";
Settings settings(nullptr, m_moduleName);
settings.add_custom_action(m_defaultSettingsName, m_defaultSettingsDescription, buttonText, value);
auto expected = m_defaultSettingsJson;
auto expectedProperties = createSettingsProperties(L"custom_action");
expectedProperties.SetNamedValue(L"value", json::JsonValue::CreateStringValue(value));
expectedProperties.SetNamedValue(L"button_text", json::JsonValue::CreateStringValue(buttonText));
expected.GetNamedObject(L"properties").SetNamedValue(m_defaultSettingsName, expectedProperties);
const auto actual = json::JsonObject::Parse(settings.serialize());
compareJsons(expected, actual);
}
};
TEST_CLASS (CustomActionObjectUnitTests)
2019-12-12 20:24:00 +03:00
{
public:
TEST_METHOD (CustomActionObjectName)
2019-12-12 20:24:00 +03:00
{
const std::wstring json = L"{\"action_name\": \"action name\", \"value\": \"action value\"}";
CustomActionObject obj = CustomActionObject::from_json_string(json);
Assert::AreEqual(std::wstring(L"action name"), obj.get_name());
}
TEST_METHOD (CustomActionObjectValue)
2019-12-12 20:24:00 +03:00
{
const std::wstring json = L"{\"action_name\": \"action name\", \"value\": \"action value\"}";
CustomActionObject obj = CustomActionObject::from_json_string(json);
Assert::AreEqual(std::wstring(L"action value"), obj.get_value());
}
};
TEST_CLASS (HotkeyObjectUnitTests)
2019-12-12 20:24:00 +03:00
{
private:
json::JsonObject m_defaultHotkeyJson = json::JsonObject::Parse(L"{\"key\":\"(Key 0)\", \"code\": 123, \"win\": true, \"ctrl\": true, \"alt\": true, \"shift\": true}");
json::JsonObject m_defaultHotkeyJsonAlternative = json::JsonObject::Parse(L"{\"key\":\"(Key 0)\", \"code\": 123, \"win\": false, \"ctrl\": false, \"alt\": false, \"shift\": false}");
public:
TEST_METHOD (GetKeyFromJson)
2019-12-12 20:24:00 +03:00
{
HotkeyObject object = HotkeyObject::from_json(m_defaultHotkeyJson);
Assert::AreEqual(std::wstring(L"(Key 0)"), object.get_key());
}
TEST_METHOD (GetKeyFromJsonString)
2019-12-12 20:24:00 +03:00
{
HotkeyObject object = HotkeyObject::from_json_string(m_defaultHotkeyJson.Stringify());
Assert::AreEqual(std::wstring(L"(Key 0)"), object.get_key());
}
TEST_METHOD (GetCodeFromJson)
2019-12-12 20:24:00 +03:00
{
HotkeyObject object = HotkeyObject::from_json(m_defaultHotkeyJson);
Assert::AreEqual(123U, object.get_code());
2019-12-12 20:24:00 +03:00
}
TEST_METHOD (GetCodeFromJsonString)
2019-12-12 20:24:00 +03:00
{
HotkeyObject object = HotkeyObject::from_json_string(m_defaultHotkeyJson.Stringify());
Assert::AreEqual(123U, object.get_code());
2019-12-12 20:24:00 +03:00
}
TEST_METHOD (GetCodeFromSettings)
2019-12-12 20:24:00 +03:00
{
HotkeyObject object = HotkeyObject::from_settings(true, true, true, true, 123);
Assert::AreEqual(123U, object.get_code());
2019-12-12 20:24:00 +03:00
}
TEST_METHOD (GetWinPressedFromJson)
2019-12-12 20:24:00 +03:00
{
HotkeyObject object = HotkeyObject::from_json(m_defaultHotkeyJson);
Assert::AreEqual(true, object.win_pressed());
HotkeyObject objectNegativeValues = HotkeyObject::from_json(m_defaultHotkeyJsonAlternative);
Assert::AreEqual(false, objectNegativeValues.win_pressed());
}
TEST_METHOD (GetWinPressedFromJsonString)
2019-12-12 20:24:00 +03:00
{
HotkeyObject object = HotkeyObject::from_json_string(m_defaultHotkeyJson.Stringify());
Assert::AreEqual(true, object.win_pressed());
HotkeyObject objectNegativeValues = HotkeyObject::from_json_string(m_defaultHotkeyJsonAlternative.Stringify());
Assert::AreEqual(false, objectNegativeValues.win_pressed());
}
TEST_METHOD (GetWinPressedFromSettings)
2019-12-12 20:24:00 +03:00
{
HotkeyObject object = HotkeyObject::from_settings(true, true, true, true, 123);
Assert::AreEqual(true, object.win_pressed());
HotkeyObject objectNegativeValues = HotkeyObject::from_settings(false, true, true, true, 123);
Assert::AreEqual(false, objectNegativeValues.win_pressed());
}
TEST_METHOD (GetCtrlPressedFromJson)
2019-12-12 20:24:00 +03:00
{
HotkeyObject object = HotkeyObject::from_json(m_defaultHotkeyJson);
Assert::AreEqual(true, object.ctrl_pressed());
HotkeyObject objectNegativeValues = HotkeyObject::from_json(m_defaultHotkeyJsonAlternative);
Assert::AreEqual(false, objectNegativeValues.ctrl_pressed());
}
TEST_METHOD (GetCtrlPressedFromJsonString)
2019-12-12 20:24:00 +03:00
{
HotkeyObject object = HotkeyObject::from_json_string(m_defaultHotkeyJson.Stringify());
Assert::AreEqual(true, object.ctrl_pressed());
HotkeyObject objectNegativeValues = HotkeyObject::from_json_string(m_defaultHotkeyJsonAlternative.Stringify());
Assert::AreEqual(false, objectNegativeValues.ctrl_pressed());
}
TEST_METHOD (GetCtrlPressedFromSettings)
2019-12-12 20:24:00 +03:00
{
HotkeyObject object = HotkeyObject::from_settings(true, true, true, true, 123);
Assert::AreEqual(true, object.ctrl_pressed());
HotkeyObject objectNegativeValues = HotkeyObject::from_settings(true, false, true, true, 123);
Assert::AreEqual(false, objectNegativeValues.ctrl_pressed());
}
TEST_METHOD (GetAltPressedFromJson)
2019-12-12 20:24:00 +03:00
{
HotkeyObject object = HotkeyObject::from_json(m_defaultHotkeyJson);
Assert::AreEqual(true, object.alt_pressed());
HotkeyObject objectNegativeValues = HotkeyObject::from_json(m_defaultHotkeyJsonAlternative);
Assert::AreEqual(false, objectNegativeValues.alt_pressed());
}
TEST_METHOD (GetAltPressedFromJsonString)
2019-12-12 20:24:00 +03:00
{
HotkeyObject object = HotkeyObject::from_json_string(m_defaultHotkeyJson.Stringify());
Assert::AreEqual(true, object.alt_pressed());
HotkeyObject objectNegativeValues = HotkeyObject::from_json_string(m_defaultHotkeyJsonAlternative.Stringify());
Assert::AreEqual(false, objectNegativeValues.alt_pressed());
}
TEST_METHOD (GetAltPressedFromSettings)
2019-12-12 20:24:00 +03:00
{
HotkeyObject object = HotkeyObject::from_settings(true, true, true, true, 123);
Assert::AreEqual(true, object.alt_pressed());
HotkeyObject objectNegativeValues = HotkeyObject::from_settings(true, true, false, true, 123);
Assert::AreEqual(false, objectNegativeValues.alt_pressed());
}
TEST_METHOD (GetShiftPressedFromJson)
2019-12-12 20:24:00 +03:00
{
HotkeyObject object = HotkeyObject::from_json(m_defaultHotkeyJson);
Assert::AreEqual(true, object.shift_pressed());
HotkeyObject objectNegativeValues = HotkeyObject::from_json(m_defaultHotkeyJsonAlternative);
Assert::AreEqual(false, objectNegativeValues.shift_pressed());
}
TEST_METHOD (GetShiftPressedFromJsonString)
2019-12-12 20:24:00 +03:00
{
HotkeyObject object = HotkeyObject::from_json_string(m_defaultHotkeyJson.Stringify());
Assert::AreEqual(true, object.shift_pressed());
HotkeyObject objectNegativeValues = HotkeyObject::from_json_string(m_defaultHotkeyJsonAlternative.Stringify());
Assert::AreEqual(false, objectNegativeValues.shift_pressed());
}
TEST_METHOD (GetShiftPressedFromSettings)
2019-12-12 20:24:00 +03:00
{
HotkeyObject object = HotkeyObject::from_settings(true, true, true, true, 123);
Assert::AreEqual(true, object.shift_pressed());
HotkeyObject objectNegativeValues = HotkeyObject::from_settings(true, true, true, false, 123);
Assert::AreEqual(false, objectNegativeValues.shift_pressed());
}
TEST_METHOD (GetModifiersRepeat)
2019-12-12 20:24:00 +03:00
{
std::map<UINT, HotkeyObject> expectedMap = {
std::make_pair(0x0000, HotkeyObject::from_settings(false, false, false, false, 0)),
std::make_pair(0x0001, HotkeyObject::from_settings(false, false, true, false, 0)),
std::make_pair(0x0002, HotkeyObject::from_settings(false, true, false, false, 0)),
std::make_pair(0x0003, HotkeyObject::from_settings(false, true, true, false, 0)),
std::make_pair(0x0004, HotkeyObject::from_settings(false, false, false, true, 0)),
std::make_pair(0x0005, HotkeyObject::from_settings(false, false, true, true, 0)),
std::make_pair(0x0006, HotkeyObject::from_settings(false, true, false, true, 0)),
std::make_pair(0x0007, HotkeyObject::from_settings(false, true, true, true, 0)),
std::make_pair(0x0008, HotkeyObject::from_settings(true, false, false, false, 0)),
std::make_pair(0x0009, HotkeyObject::from_settings(true, false, true, false, 0)),
std::make_pair(0x000A, HotkeyObject::from_settings(true, true, false, false, 0)),
std::make_pair(0x000B, HotkeyObject::from_settings(true, true, true, false, 0)),
std::make_pair(0x000C, HotkeyObject::from_settings(true, false, false, true, 0)),
std::make_pair(0x000D, HotkeyObject::from_settings(true, false, true, true, 0)),
std::make_pair(0x000E, HotkeyObject::from_settings(true, true, false, true, 0)),
std::make_pair(0x000F, HotkeyObject::from_settings(true, true, true, true, 0))
};
for (const auto& iter : expectedMap)
{
Assert::AreEqual(iter.first, iter.second.get_modifiers_repeat());
}
}
TEST_METHOD (GetModifiers)
2019-12-12 20:24:00 +03:00
{
std::map<UINT, HotkeyObject> expectedMap = {
std::make_pair(0x4000, HotkeyObject::from_settings(false, false, false, false, 0)),
std::make_pair(0x4001, HotkeyObject::from_settings(false, false, true, false, 0)),
std::make_pair(0x4002, HotkeyObject::from_settings(false, true, false, false, 0)),
std::make_pair(0x4003, HotkeyObject::from_settings(false, true, true, false, 0)),
std::make_pair(0x4004, HotkeyObject::from_settings(false, false, false, true, 0)),
std::make_pair(0x4005, HotkeyObject::from_settings(false, false, true, true, 0)),
std::make_pair(0x4006, HotkeyObject::from_settings(false, true, false, true, 0)),
std::make_pair(0x4007, HotkeyObject::from_settings(false, true, true, true, 0)),
std::make_pair(0x4008, HotkeyObject::from_settings(true, false, false, false, 0)),
std::make_pair(0x4009, HotkeyObject::from_settings(true, false, true, false, 0)),
std::make_pair(0x400A, HotkeyObject::from_settings(true, true, false, false, 0)),
std::make_pair(0x400B, HotkeyObject::from_settings(true, true, true, false, 0)),
std::make_pair(0x400C, HotkeyObject::from_settings(true, false, false, true, 0)),
std::make_pair(0x400D, HotkeyObject::from_settings(true, false, true, true, 0)),
std::make_pair(0x400E, HotkeyObject::from_settings(true, true, false, true, 0)),
std::make_pair(0x400F, HotkeyObject::from_settings(true, true, true, true, 0))
};
for (const auto& iter : expectedMap)
{
Assert::AreEqual(iter.first, iter.second.get_modifiers());
}
}
2019-12-10 10:28:24 +03:00
};
}