8ba8f35dc5
This PR represents the start of the work on Cascading User + default settings, #754. Cascading settings will be done in two parts: * [ ] Layered Default+User settings (this PR) * [ ] Dynamic Profile Generation (#2603). Until _both_ are done, _neither are going in. The dynamic profiles PR will target this PR when it's ready, but will go in as a separate commit into master. This PR covers adding one primary feature: the settings are now in two separate files: * a static `defaults.json` that ships with the package (the "default settings") * a `profiles.json` with the user's customizations (the "user settings) User settings are _layered_ upon the settings in the defaults settings. ## References Other things that might be related here: * #1378 - This seems like it's definitely fixed. The default keybindings are _much_ cleaner, and without the save-on-load behavior, the user's keybindings will be left in a good state * #1398 - This might have honestly been solved by #2475 ## PR Checklist * [x] Closes #754 * [x] Closes #1378 * [x] Closes #2566 * [x] I work here * [x] Tests added/passed * [x] Requires documentation to be updated - it **ABSOLUTELY DOES** ## Detailed Description of the Pull Request / Additional comments 1. We start by taking all of the `FromJson` functions in Profile, ColorScheme, Globals, etc, and converting them to `LayerJson` methods. These are effectively the same, with the change that instead of building a new object, they are simply layering the values on top of `this` object. 2. Next, we add tests for layering properties like that. 3. Now, we add a `defaults.json` to the package. This is the file the users can refer to as our default settings. 4. We then take that `defaults.json` and stamp it into an auto generated `.h` file, so we can use it's data without having to worry about reading it from disk. 5. We then change the `LoadAll` function in `CascadiaSettings`. Now, the function does two loads - one from the defaults, and then a second load from the `profiles.json` file, layering the settings from each source upon the previous values. 6. If the `profiles.json` file doesn't exist, we'll create it from a hardcoded `userDefaults.json`, which is stamped in similar to how `defaults.json` is. 7. We also add support for _unbinding_ keybindings that might exist in the `defaults.json`, but the user doesn't want to be bound to anything. 8. We add support for _hiding_ a profile, which is useful if a user doesn't want one of the default profiles to appear in the list of profiles. ## TODO: * [x] Still need to make Alt+Click work on the settings button * [x] Need to write some user documentation on how the new settings model works * [x] Fix the pair of tests I broke (re: Duplicate profiles) <hr> * Create profiles by layering them * Update test to layer multiple times on the same profile * Add support for layering an array of profiles, but break a couple tests * Add a defaults.json to the package * Layer colorschemes * Moves tests into individual classes * adds support for layering a colorscheme on top of another * Layer an array of color schemes * oh no, this was missed with #2481 must have committed without staging this change, uh oh. Not like those tests actually work so nbd * Layer keybindings * Read settings from defaults.json + profiles.json, layer appropriately This is like 80% of #754. Needs tests. * Add tests for keybindings * add support to unbind a key with `null` or `"unbound"` or `"garbage"` * Layer or clear optional properties * Add a helper to get an optional variable for a bunch of different types In the end, I think we need to ask _was this worth it_ * Do this with the stretch mode too * Add back in the GUID check for profiles * Add some tests for global settings layering * M A D W I T H P O W E R Add a MsBuild target to auto-generate a header with the defaults.json as a string in the file. That way, we can _always_ load the defaults. Literally impossible to not. * When the user's profile.json doesn't exist, create it from a template * Re-order profiles to match the order set in the user's profiles.json * Add tests for re-ordering profiles to match user ordering * Add support for hiding profiles using `"hidden": true` * Use the hardcoded defaults.json for the exception->"use defaults" case * Somehow I messed up the git submodules? * woo documentation * Fix a Terminal.App.Unit.Tests failure * signed/unsigned is hard * Use Alt+Settings button to open the default settings * Missed a signed/unsigned * Some very preliminary PR feedback * More PR feedback Use the wil helper for the exe path Move jsonutils into their own file kill some dead code * Add templates to these bois * remove some code for generating defaults, reorder defaults.json a tad * Make guid a std::optional * Large block of PR feedback * Remove some dead code * add some comments * tag some todos * stl is love, stl is life * add `-noprofile` * Fix the crash that dustin found * -Encoding ASCII * Set a profile's default scheme to Campbell * Fix the tests I regressed * Update UsingJsonSetting.md to reflect that changes from these PRs * Change how GenerateGuidForProfile works * Make AppKeyBindings do its own serialization * Remove leftover dead code from the previous commit * Fix up an enormous number of PR nits * Fix a typo; Update the defaults to match #2378 * Tiny nits * Some typos, PR nits * Fix this broken defaults case
958 lines
40 KiB
C++
958 lines
40 KiB
C++
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT license.
|
|
|
|
#include "precomp.h"
|
|
|
|
#include "../TerminalApp/ColorScheme.h"
|
|
#include "../TerminalApp/CascadiaSettings.h"
|
|
#include "JsonTestClass.h"
|
|
#include <defaults.h>
|
|
|
|
using namespace Microsoft::Console;
|
|
using namespace TerminalApp;
|
|
using namespace WEX::Logging;
|
|
using namespace WEX::TestExecution;
|
|
using namespace WEX::Common;
|
|
|
|
namespace TerminalAppLocalTests
|
|
{
|
|
// Unfortunately, these tests _WILL NOT_ work in our CI, until we have a lab
|
|
// machine available that can run Windows version 18362.
|
|
|
|
class SettingsTests : public JsonTestClass
|
|
{
|
|
// Use a custom manifest to ensure that we can activate winrt types from
|
|
// our test. This property will tell taef to manually use this as the
|
|
// sxs manifest during this test class. It includes all the cppwinrt
|
|
// types we've defined, so if your test is crashing for an unknown
|
|
// reason, make sure it's included in that file.
|
|
// If you want to do anything XAML-y, you'll need to run your test in a
|
|
// packaged context. See TabTests.cpp for more details on that.
|
|
BEGIN_TEST_CLASS(SettingsTests)
|
|
TEST_CLASS_PROPERTY(L"ActivationContext", L"TerminalApp.LocalTests.manifest")
|
|
END_TEST_CLASS()
|
|
|
|
TEST_METHOD(TryCreateWinRTType);
|
|
TEST_METHOD(ValidateProfilesExist);
|
|
TEST_METHOD(ValidateDefaultProfileExists);
|
|
TEST_METHOD(ValidateDuplicateProfiles);
|
|
TEST_METHOD(ValidateManyWarnings);
|
|
TEST_METHOD(LayerGlobalProperties);
|
|
TEST_METHOD(ValidateProfileOrdering);
|
|
TEST_METHOD(ValidateHideProfiles);
|
|
TEST_METHOD(ValidateProfilesGenerateGuids);
|
|
TEST_METHOD(GeneratedGuidRoundtrips);
|
|
TEST_METHOD(TestAllValidationsWithNullGuids);
|
|
TEST_METHOD(TestReorderWithNullGuids);
|
|
TEST_METHOD(TestReorderingWithoutGuid);
|
|
|
|
TEST_CLASS_SETUP(ClassSetup)
|
|
{
|
|
InitializeJsonReader();
|
|
return true;
|
|
}
|
|
};
|
|
|
|
void SettingsTests::TryCreateWinRTType()
|
|
{
|
|
winrt::Microsoft::Terminal::Settings::TerminalSettings settings;
|
|
VERIFY_IS_NOT_NULL(settings);
|
|
auto oldFontSize = settings.FontSize();
|
|
settings.FontSize(oldFontSize + 5);
|
|
auto newFontSize = settings.FontSize();
|
|
VERIFY_ARE_NOT_EQUAL(oldFontSize, newFontSize);
|
|
}
|
|
|
|
void SettingsTests::ValidateProfilesExist()
|
|
{
|
|
const std::string settingsWithProfiles{ R"(
|
|
{
|
|
"profiles": [
|
|
{
|
|
"name" : "profile0"
|
|
}
|
|
]
|
|
})" };
|
|
|
|
const std::string settingsWithoutProfiles{ R"(
|
|
{
|
|
"defaultProfile": "{6239a42c-1de4-49a3-80bd-e8fdd045185c}"
|
|
})" };
|
|
|
|
const std::string settingsWithEmptyProfiles{ R"(
|
|
{
|
|
"profiles": []
|
|
})" };
|
|
|
|
{
|
|
// Case 1: Good settings
|
|
const auto settingsObject = VerifyParseSucceeded(settingsWithProfiles);
|
|
auto settings = CascadiaSettings::FromJson(settingsObject);
|
|
settings->_ValidateProfilesExist();
|
|
}
|
|
{
|
|
// Case 2: Bad settings
|
|
const auto settingsObject = VerifyParseSucceeded(settingsWithoutProfiles);
|
|
auto settings = CascadiaSettings::FromJson(settingsObject);
|
|
bool caughtExpectedException = false;
|
|
try
|
|
{
|
|
settings->_ValidateProfilesExist();
|
|
}
|
|
catch (const ::TerminalApp::SettingsException& ex)
|
|
{
|
|
VERIFY_IS_TRUE(ex.Error() == ::TerminalApp::SettingsLoadErrors::NoProfiles);
|
|
caughtExpectedException = true;
|
|
}
|
|
VERIFY_IS_TRUE(caughtExpectedException);
|
|
}
|
|
{
|
|
// Case 3: Bad settings
|
|
const auto settingsObject = VerifyParseSucceeded(settingsWithEmptyProfiles);
|
|
auto settings = CascadiaSettings::FromJson(settingsObject);
|
|
bool caughtExpectedException = false;
|
|
try
|
|
{
|
|
settings->_ValidateProfilesExist();
|
|
}
|
|
catch (const ::TerminalApp::SettingsException& ex)
|
|
{
|
|
VERIFY_IS_TRUE(ex.Error() == ::TerminalApp::SettingsLoadErrors::NoProfiles);
|
|
caughtExpectedException = true;
|
|
}
|
|
VERIFY_IS_TRUE(caughtExpectedException);
|
|
}
|
|
}
|
|
|
|
void SettingsTests::ValidateDefaultProfileExists()
|
|
{
|
|
const std::string goodProfiles{ R"(
|
|
{
|
|
"globals": {
|
|
"defaultProfile": "{6239a42c-1111-49a3-80bd-e8fdd045185c}"
|
|
},
|
|
"profiles": [
|
|
{
|
|
"name" : "profile0",
|
|
"guid": "{6239a42c-1111-49a3-80bd-e8fdd045185c}"
|
|
},
|
|
{
|
|
"name" : "profile0",
|
|
"guid": "{6239a42c-2222-49a3-80bd-e8fdd045185c}"
|
|
}
|
|
]
|
|
})" };
|
|
|
|
const std::string badProfiles{ R"(
|
|
{
|
|
"globals": {
|
|
"defaultProfile": "{6239a42c-1111-49a3-80bd-e8fdd045185c}"
|
|
},
|
|
"profiles": [
|
|
{
|
|
"name" : "profile0",
|
|
"guid": "{6239a42c-3333-49a3-80bd-e8fdd045185c}"
|
|
},
|
|
{
|
|
"name" : "profile1",
|
|
"guid": "{6239a42c-4444-49a3-80bd-e8fdd045185c}"
|
|
}
|
|
]
|
|
})" };
|
|
|
|
const std::string noDefaultAtAll{ R"(
|
|
{
|
|
"globals": {
|
|
"alwaysShowTabs": true
|
|
},
|
|
"profiles": [
|
|
{
|
|
"name" : "profile0",
|
|
"guid": "{6239a42c-5555-49a3-80bd-e8fdd045185c}"
|
|
},
|
|
{
|
|
"name" : "profile1",
|
|
"guid": "{6239a42c-6666-49a3-80bd-e8fdd045185c}"
|
|
}
|
|
]
|
|
})" };
|
|
|
|
{
|
|
// Case 1: Good settings
|
|
Log::Comment(NoThrowString().Format(
|
|
L"Testing a pair of profiles with unique guids, and the defaultProfile is one of those guids"));
|
|
const auto settingsObject = VerifyParseSucceeded(goodProfiles);
|
|
auto settings = CascadiaSettings::FromJson(settingsObject);
|
|
settings->_ValidateDefaultProfileExists();
|
|
VERIFY_ARE_EQUAL(static_cast<size_t>(0), settings->_warnings.size());
|
|
VERIFY_ARE_EQUAL(static_cast<size_t>(2), settings->_profiles.size());
|
|
VERIFY_ARE_EQUAL(settings->_globals.GetDefaultProfile(), settings->_profiles.at(0).GetGuid());
|
|
}
|
|
{
|
|
// Case 2: Bad settings
|
|
Log::Comment(NoThrowString().Format(
|
|
L"Testing a pair of profiles with unique guids, but the defaultProfile is NOT one of those guids"));
|
|
const auto settingsObject = VerifyParseSucceeded(badProfiles);
|
|
auto settings = CascadiaSettings::FromJson(settingsObject);
|
|
settings->_ValidateDefaultProfileExists();
|
|
VERIFY_ARE_EQUAL(static_cast<size_t>(1), settings->_warnings.size());
|
|
VERIFY_ARE_EQUAL(::TerminalApp::SettingsLoadWarnings::MissingDefaultProfile, settings->_warnings.at(0));
|
|
|
|
VERIFY_ARE_EQUAL(static_cast<size_t>(2), settings->_profiles.size());
|
|
VERIFY_ARE_EQUAL(settings->_globals.GetDefaultProfile(), settings->_profiles.at(0).GetGuid());
|
|
}
|
|
{
|
|
// Case 2: Bad settings
|
|
Log::Comment(NoThrowString().Format(
|
|
L"Testing a pair of profiles with unique guids, and no defaultProfile at all"));
|
|
const auto settingsObject = VerifyParseSucceeded(badProfiles);
|
|
auto settings = CascadiaSettings::FromJson(settingsObject);
|
|
settings->_ValidateDefaultProfileExists();
|
|
VERIFY_ARE_EQUAL(static_cast<size_t>(1), settings->_warnings.size());
|
|
VERIFY_ARE_EQUAL(::TerminalApp::SettingsLoadWarnings::MissingDefaultProfile, settings->_warnings.at(0));
|
|
|
|
VERIFY_ARE_EQUAL(static_cast<size_t>(2), settings->_profiles.size());
|
|
VERIFY_ARE_EQUAL(settings->_globals.GetDefaultProfile(), settings->_profiles.at(0).GetGuid());
|
|
}
|
|
}
|
|
|
|
void SettingsTests::ValidateDuplicateProfiles()
|
|
{
|
|
const std::string goodProfiles{ R"(
|
|
{
|
|
"profiles": [
|
|
{
|
|
"name" : "profile0",
|
|
"guid": "{6239a42c-1111-49a3-80bd-e8fdd045185c}"
|
|
},
|
|
{
|
|
"name" : "profile0",
|
|
"guid": "{6239a42c-2222-49a3-80bd-e8fdd045185c}"
|
|
}
|
|
]
|
|
})" };
|
|
|
|
const std::string badProfiles{ R"(
|
|
{
|
|
"profiles": [
|
|
{
|
|
"name" : "profile0",
|
|
"guid": "{6239a42c-3333-49a3-80bd-e8fdd045185c}"
|
|
},
|
|
{
|
|
"name" : "profile1",
|
|
"guid": "{6239a42c-3333-49a3-80bd-e8fdd045185c}"
|
|
}
|
|
]
|
|
})" };
|
|
|
|
const std::string veryBadProfiles{ R"(
|
|
{
|
|
"profiles": [
|
|
{
|
|
"name" : "profile0",
|
|
"guid": "{6239a42c-4444-49a3-80bd-e8fdd045185c}"
|
|
},
|
|
{
|
|
"name" : "profile1",
|
|
"guid": "{6239a42c-5555-49a3-80bd-e8fdd045185c}"
|
|
},
|
|
{
|
|
"name" : "profile2",
|
|
"guid": "{6239a42c-4444-49a3-80bd-e8fdd045185c}"
|
|
},
|
|
{
|
|
"name" : "profile3",
|
|
"guid": "{6239a42c-4444-49a3-80bd-e8fdd045185c}"
|
|
},
|
|
{
|
|
"name" : "profile4",
|
|
"guid": "{6239a42c-6666-49a3-80bd-e8fdd045185c}"
|
|
},
|
|
{
|
|
"name" : "profile5",
|
|
"guid": "{6239a42c-5555-49a3-80bd-e8fdd045185c}"
|
|
},
|
|
{
|
|
"name" : "profile6",
|
|
"guid": "{6239a42c-7777-49a3-80bd-e8fdd045185c}"
|
|
}
|
|
]
|
|
})" };
|
|
Profile profile0{ Microsoft::Console::Utils::GuidFromString(L"{6239a42c-4444-49a3-80bd-e8fdd045185c}") };
|
|
profile0._name = L"profile0";
|
|
Profile profile1{ Microsoft::Console::Utils::GuidFromString(L"{6239a42c-5555-49a3-80bd-e8fdd045185c}") };
|
|
profile1._name = L"profile1";
|
|
Profile profile2{ Microsoft::Console::Utils::GuidFromString(L"{6239a42c-4444-49a3-80bd-e8fdd045185c}") };
|
|
profile2._name = L"profile2";
|
|
Profile profile3{ Microsoft::Console::Utils::GuidFromString(L"{6239a42c-4444-49a3-80bd-e8fdd045185c}") };
|
|
profile3._name = L"profile3";
|
|
Profile profile4{ Microsoft::Console::Utils::GuidFromString(L"{6239a42c-6666-49a3-80bd-e8fdd045185c}") };
|
|
profile4._name = L"profile4";
|
|
Profile profile5{ Microsoft::Console::Utils::GuidFromString(L"{6239a42c-5555-49a3-80bd-e8fdd045185c}") };
|
|
profile5._name = L"profile5";
|
|
Profile profile6{ Microsoft::Console::Utils::GuidFromString(L"{6239a42c-7777-49a3-80bd-e8fdd045185c}") };
|
|
profile6._name = L"profile6";
|
|
|
|
{
|
|
// Case 1: Good settings
|
|
Log::Comment(NoThrowString().Format(
|
|
L"Testing a pair of profiles with unique guids"));
|
|
|
|
CascadiaSettings settings;
|
|
settings._profiles.push_back(profile0);
|
|
settings._profiles.push_back(profile1);
|
|
|
|
settings._ValidateNoDuplicateProfiles();
|
|
|
|
VERIFY_ARE_EQUAL(static_cast<size_t>(0), settings._warnings.size());
|
|
VERIFY_ARE_EQUAL(static_cast<size_t>(2), settings._profiles.size());
|
|
}
|
|
{
|
|
// Case 2: Bad settings
|
|
Log::Comment(NoThrowString().Format(
|
|
L"Testing a pair of profiles with the same guid"));
|
|
|
|
CascadiaSettings settings;
|
|
settings._profiles.push_back(profile2);
|
|
settings._profiles.push_back(profile3);
|
|
|
|
settings._ValidateNoDuplicateProfiles();
|
|
|
|
VERIFY_ARE_EQUAL(static_cast<size_t>(1), settings._warnings.size());
|
|
VERIFY_ARE_EQUAL(::TerminalApp::SettingsLoadWarnings::DuplicateProfile, settings._warnings.at(0));
|
|
|
|
VERIFY_ARE_EQUAL(static_cast<size_t>(1), settings._profiles.size());
|
|
VERIFY_ARE_EQUAL(L"profile2", settings._profiles.at(0).GetName());
|
|
}
|
|
{
|
|
// Case 3: Very bad settings
|
|
Log::Comment(NoThrowString().Format(
|
|
L"Testing a set of profiles, many of which with duplicated guids"));
|
|
|
|
CascadiaSettings settings;
|
|
settings._profiles.push_back(profile0);
|
|
settings._profiles.push_back(profile1);
|
|
settings._profiles.push_back(profile2);
|
|
settings._profiles.push_back(profile3);
|
|
settings._profiles.push_back(profile4);
|
|
settings._profiles.push_back(profile5);
|
|
settings._profiles.push_back(profile6);
|
|
|
|
settings._ValidateNoDuplicateProfiles();
|
|
|
|
VERIFY_ARE_EQUAL(static_cast<size_t>(1), settings._warnings.size());
|
|
VERIFY_ARE_EQUAL(::TerminalApp::SettingsLoadWarnings::DuplicateProfile, settings._warnings.at(0));
|
|
|
|
VERIFY_ARE_EQUAL(static_cast<size_t>(4), settings._profiles.size());
|
|
VERIFY_ARE_EQUAL(L"profile0", settings._profiles.at(0).GetName());
|
|
VERIFY_ARE_EQUAL(L"profile1", settings._profiles.at(1).GetName());
|
|
VERIFY_ARE_EQUAL(L"profile4", settings._profiles.at(2).GetName());
|
|
VERIFY_ARE_EQUAL(L"profile6", settings._profiles.at(3).GetName());
|
|
}
|
|
}
|
|
|
|
void SettingsTests::ValidateManyWarnings()
|
|
{
|
|
const std::string badProfiles{ R"(
|
|
{
|
|
"globals": {
|
|
"defaultProfile": "{6239a42c-1111-49a3-80bd-e8fdd045185c}"
|
|
},
|
|
"profiles": [
|
|
{
|
|
"name" : "profile0",
|
|
"guid": "{6239a42c-2222-49a3-80bd-e8fdd045185c}"
|
|
},
|
|
{
|
|
"name" : "profile1",
|
|
"guid": "{6239a42c-3333-49a3-80bd-e8fdd045185c}"
|
|
},
|
|
{
|
|
"name" : "profile2",
|
|
"guid": "{6239a42c-2222-49a3-80bd-e8fdd045185c}"
|
|
}
|
|
]
|
|
})" };
|
|
Profile profile4{ Microsoft::Console::Utils::GuidFromString(L"{6239a42c-4444-49a3-80bd-e8fdd045185c}") };
|
|
profile4._name = L"profile4";
|
|
Profile profile5{ Microsoft::Console::Utils::GuidFromString(L"{6239a42c-4444-49a3-80bd-e8fdd045185c}") };
|
|
profile5._name = L"profile5";
|
|
|
|
// Case 2: Bad settings
|
|
Log::Comment(NoThrowString().Format(
|
|
L"Testing a pair of profiles with the same guid"));
|
|
const auto settingsObject = VerifyParseSucceeded(badProfiles);
|
|
auto settings = CascadiaSettings::FromJson(settingsObject);
|
|
|
|
settings->_profiles.push_back(profile4);
|
|
settings->_profiles.push_back(profile5);
|
|
|
|
settings->_ValidateSettings();
|
|
|
|
VERIFY_ARE_EQUAL(2u, settings->_warnings.size());
|
|
VERIFY_ARE_EQUAL(::TerminalApp::SettingsLoadWarnings::DuplicateProfile, settings->_warnings.at(0));
|
|
VERIFY_ARE_EQUAL(::TerminalApp::SettingsLoadWarnings::MissingDefaultProfile, settings->_warnings.at(1));
|
|
|
|
VERIFY_ARE_EQUAL(3u, settings->_profiles.size());
|
|
VERIFY_ARE_EQUAL(settings->_globals.GetDefaultProfile(), settings->_profiles.at(0).GetGuid());
|
|
VERIFY_IS_TRUE(settings->_profiles.at(0)._guid.has_value());
|
|
VERIFY_IS_TRUE(settings->_profiles.at(1)._guid.has_value());
|
|
VERIFY_IS_TRUE(settings->_profiles.at(2)._guid.has_value());
|
|
}
|
|
|
|
void SettingsTests::LayerGlobalProperties()
|
|
{
|
|
const std::string settings0String{ R"(
|
|
{
|
|
"globals": {
|
|
"alwaysShowTabs": true,
|
|
"initialCols" : 120,
|
|
"initialRows" : 30
|
|
}
|
|
})" };
|
|
const std::string settings1String{ R"(
|
|
{
|
|
"globals": {
|
|
"showTabsInTitlebar": false,
|
|
"initialCols" : 240,
|
|
"initialRows" : 60
|
|
}
|
|
})" };
|
|
const auto settings0Json = VerifyParseSucceeded(settings0String);
|
|
const auto settings1Json = VerifyParseSucceeded(settings1String);
|
|
|
|
CascadiaSettings settings;
|
|
|
|
settings.LayerJson(settings0Json);
|
|
VERIFY_ARE_EQUAL(true, settings._globals._alwaysShowTabs);
|
|
VERIFY_ARE_EQUAL(120, settings._globals._initialCols);
|
|
VERIFY_ARE_EQUAL(30, settings._globals._initialRows);
|
|
VERIFY_ARE_EQUAL(true, settings._globals._showTabsInTitlebar);
|
|
|
|
settings.LayerJson(settings1Json);
|
|
VERIFY_ARE_EQUAL(true, settings._globals._alwaysShowTabs);
|
|
VERIFY_ARE_EQUAL(240, settings._globals._initialCols);
|
|
VERIFY_ARE_EQUAL(60, settings._globals._initialRows);
|
|
VERIFY_ARE_EQUAL(false, settings._globals._showTabsInTitlebar);
|
|
}
|
|
|
|
void SettingsTests::ValidateProfileOrdering()
|
|
{
|
|
const std::string userProfiles0String{ R"(
|
|
{
|
|
"profiles": [
|
|
{
|
|
"name" : "profile0",
|
|
"guid": "{6239a42c-0000-49a3-80bd-e8fdd045185c}"
|
|
},
|
|
{
|
|
"name" : "profile1",
|
|
"guid": "{6239a42c-1111-49a3-80bd-e8fdd045185c}"
|
|
}
|
|
]
|
|
})" };
|
|
|
|
const std::string defaultProfilesString{ R"(
|
|
{
|
|
"profiles": [
|
|
{
|
|
"name" : "profile2",
|
|
"guid": "{6239a42c-1111-49a3-80bd-e8fdd045185c}"
|
|
},
|
|
{
|
|
"name" : "profile3",
|
|
"guid": "{6239a42c-0000-49a3-80bd-e8fdd045185c}"
|
|
}
|
|
]
|
|
})" };
|
|
|
|
const std::string userProfiles1String{ R"(
|
|
{
|
|
"profiles": [
|
|
{
|
|
"name" : "profile4",
|
|
"guid": "{6239a42c-0000-49a3-80bd-e8fdd045185c}"
|
|
},
|
|
{
|
|
"name" : "profile5",
|
|
"guid": "{6239a42c-2222-49a3-80bd-e8fdd045185c}"
|
|
}
|
|
]
|
|
})" };
|
|
|
|
const auto userProfiles0Json = VerifyParseSucceeded(userProfiles0String);
|
|
const auto userProfiles1Json = VerifyParseSucceeded(userProfiles1String);
|
|
const auto defaultProfilesJson = VerifyParseSucceeded(defaultProfilesString);
|
|
|
|
{
|
|
Log::Comment(NoThrowString().Format(
|
|
L"Case 1: Simple swapping of the ordering. The user has the "
|
|
L"default profiles in the opposite order of the default ordering."));
|
|
|
|
CascadiaSettings settings;
|
|
settings._LayerJsonString(defaultProfilesString, true);
|
|
VERIFY_ARE_EQUAL(2u, settings._profiles.size());
|
|
VERIFY_ARE_EQUAL(L"profile2", settings._profiles.at(0)._name);
|
|
VERIFY_ARE_EQUAL(L"profile3", settings._profiles.at(1)._name);
|
|
|
|
settings._LayerJsonString(userProfiles0String, false);
|
|
VERIFY_ARE_EQUAL(2u, settings._profiles.size());
|
|
VERIFY_ARE_EQUAL(L"profile1", settings._profiles.at(0)._name);
|
|
VERIFY_ARE_EQUAL(L"profile0", settings._profiles.at(1)._name);
|
|
|
|
settings._ReorderProfilesToMatchUserSettingsOrder();
|
|
VERIFY_ARE_EQUAL(2u, settings._profiles.size());
|
|
VERIFY_ARE_EQUAL(L"profile0", settings._profiles.at(0)._name);
|
|
VERIFY_ARE_EQUAL(L"profile1", settings._profiles.at(1)._name);
|
|
}
|
|
|
|
{
|
|
Log::Comment(NoThrowString().Format(
|
|
L"Case 2: Make sure all the user's profiles appear before the defaults."));
|
|
|
|
CascadiaSettings settings;
|
|
settings._LayerJsonString(defaultProfilesString, true);
|
|
VERIFY_ARE_EQUAL(2u, settings._profiles.size());
|
|
VERIFY_ARE_EQUAL(L"profile2", settings._profiles.at(0)._name);
|
|
VERIFY_ARE_EQUAL(L"profile3", settings._profiles.at(1)._name);
|
|
|
|
settings._LayerJsonString(userProfiles1String, false);
|
|
VERIFY_ARE_EQUAL(3u, settings._profiles.size());
|
|
VERIFY_ARE_EQUAL(L"profile2", settings._profiles.at(0)._name);
|
|
VERIFY_ARE_EQUAL(L"profile4", settings._profiles.at(1)._name);
|
|
VERIFY_ARE_EQUAL(L"profile5", settings._profiles.at(2)._name);
|
|
|
|
settings._ReorderProfilesToMatchUserSettingsOrder();
|
|
VERIFY_ARE_EQUAL(3u, settings._profiles.size());
|
|
VERIFY_ARE_EQUAL(L"profile4", settings._profiles.at(0)._name);
|
|
VERIFY_ARE_EQUAL(L"profile5", settings._profiles.at(1)._name);
|
|
VERIFY_ARE_EQUAL(L"profile2", settings._profiles.at(2)._name);
|
|
}
|
|
}
|
|
|
|
void SettingsTests::ValidateHideProfiles()
|
|
{
|
|
const std::string defaultProfilesString{ R"(
|
|
{
|
|
"profiles": [
|
|
{
|
|
"name" : "profile2",
|
|
"guid": "{6239a42c-1111-49a3-80bd-e8fdd045185c}"
|
|
},
|
|
{
|
|
"name" : "profile3",
|
|
"guid": "{6239a42c-0000-49a3-80bd-e8fdd045185c}"
|
|
}
|
|
]
|
|
})" };
|
|
|
|
const std::string userProfiles0String{ R"(
|
|
{
|
|
"profiles": [
|
|
{
|
|
"name" : "profile0",
|
|
"guid": "{6239a42c-0000-49a3-80bd-e8fdd045185c}",
|
|
"hidden": true
|
|
},
|
|
{
|
|
"name" : "profile1",
|
|
"guid": "{6239a42c-1111-49a3-80bd-e8fdd045185c}"
|
|
}
|
|
]
|
|
})" };
|
|
|
|
const std::string userProfiles1String{ R"(
|
|
{
|
|
"profiles": [
|
|
{
|
|
"name" : "profile4",
|
|
"guid": "{6239a42c-0000-49a3-80bd-e8fdd045185c}",
|
|
"hidden": true
|
|
},
|
|
{
|
|
"name" : "profile5",
|
|
"guid": "{6239a42c-2222-49a3-80bd-e8fdd045185c}"
|
|
},
|
|
{
|
|
"name" : "profile6",
|
|
"guid": "{6239a42c-3333-49a3-80bd-e8fdd045185c}",
|
|
"hidden": true
|
|
}
|
|
]
|
|
})" };
|
|
|
|
const auto userProfiles0Json = VerifyParseSucceeded(userProfiles0String);
|
|
const auto userProfiles1Json = VerifyParseSucceeded(userProfiles1String);
|
|
const auto defaultProfilesJson = VerifyParseSucceeded(defaultProfilesString);
|
|
|
|
{
|
|
CascadiaSettings settings;
|
|
settings._LayerJsonString(defaultProfilesString, true);
|
|
VERIFY_ARE_EQUAL(2u, settings._profiles.size());
|
|
VERIFY_ARE_EQUAL(L"profile2", settings._profiles.at(0)._name);
|
|
VERIFY_ARE_EQUAL(L"profile3", settings._profiles.at(1)._name);
|
|
VERIFY_ARE_EQUAL(false, settings._profiles.at(0)._hidden);
|
|
VERIFY_ARE_EQUAL(false, settings._profiles.at(1)._hidden);
|
|
|
|
settings._LayerJsonString(userProfiles0String, false);
|
|
VERIFY_ARE_EQUAL(2u, settings._profiles.size());
|
|
VERIFY_ARE_EQUAL(L"profile1", settings._profiles.at(0)._name);
|
|
VERIFY_ARE_EQUAL(L"profile0", settings._profiles.at(1)._name);
|
|
VERIFY_ARE_EQUAL(false, settings._profiles.at(0)._hidden);
|
|
VERIFY_ARE_EQUAL(true, settings._profiles.at(1)._hidden);
|
|
|
|
settings._ReorderProfilesToMatchUserSettingsOrder();
|
|
settings._RemoveHiddenProfiles();
|
|
VERIFY_ARE_EQUAL(1u, settings._profiles.size());
|
|
VERIFY_ARE_EQUAL(L"profile1", settings._profiles.at(0)._name);
|
|
VERIFY_ARE_EQUAL(false, settings._profiles.at(0)._hidden);
|
|
}
|
|
|
|
{
|
|
CascadiaSettings settings;
|
|
settings._LayerJsonString(defaultProfilesString, true);
|
|
VERIFY_ARE_EQUAL(2u, settings._profiles.size());
|
|
VERIFY_ARE_EQUAL(L"profile2", settings._profiles.at(0)._name);
|
|
VERIFY_ARE_EQUAL(L"profile3", settings._profiles.at(1)._name);
|
|
VERIFY_ARE_EQUAL(false, settings._profiles.at(0)._hidden);
|
|
VERIFY_ARE_EQUAL(false, settings._profiles.at(1)._hidden);
|
|
|
|
settings._LayerJsonString(userProfiles1String, false);
|
|
VERIFY_ARE_EQUAL(4u, settings._profiles.size());
|
|
VERIFY_ARE_EQUAL(L"profile2", settings._profiles.at(0)._name);
|
|
VERIFY_ARE_EQUAL(L"profile4", settings._profiles.at(1)._name);
|
|
VERIFY_ARE_EQUAL(L"profile5", settings._profiles.at(2)._name);
|
|
VERIFY_ARE_EQUAL(L"profile6", settings._profiles.at(3)._name);
|
|
VERIFY_ARE_EQUAL(false, settings._profiles.at(0)._hidden);
|
|
VERIFY_ARE_EQUAL(true, settings._profiles.at(1)._hidden);
|
|
VERIFY_ARE_EQUAL(false, settings._profiles.at(2)._hidden);
|
|
VERIFY_ARE_EQUAL(true, settings._profiles.at(3)._hidden);
|
|
|
|
settings._ReorderProfilesToMatchUserSettingsOrder();
|
|
settings._RemoveHiddenProfiles();
|
|
VERIFY_ARE_EQUAL(2u, settings._profiles.size());
|
|
VERIFY_ARE_EQUAL(L"profile5", settings._profiles.at(0)._name);
|
|
VERIFY_ARE_EQUAL(L"profile2", settings._profiles.at(1)._name);
|
|
VERIFY_ARE_EQUAL(false, settings._profiles.at(0)._hidden);
|
|
VERIFY_ARE_EQUAL(false, settings._profiles.at(1)._hidden);
|
|
}
|
|
}
|
|
|
|
void SettingsTests::ValidateProfilesGenerateGuids()
|
|
{
|
|
const std::string profile0String{ R"(
|
|
{
|
|
"name" : "profile0"
|
|
})" };
|
|
const std::string profile1String{ R"(
|
|
{
|
|
"name" : "profile1"
|
|
})" };
|
|
const std::string profile2String{ R"(
|
|
{
|
|
"name" : "profile2",
|
|
"guid" : null
|
|
})" };
|
|
const std::string profile3String{ R"(
|
|
{
|
|
"name" : "profile3",
|
|
"guid" : "{00000000-0000-0000-0000-000000000000}"
|
|
})" };
|
|
const std::string profile4String{ R"(
|
|
{
|
|
"name" : "profile4",
|
|
"guid" : "{6239a42c-1de4-49a3-80bd-e8fdd045185c}"
|
|
})" };
|
|
const std::string profile5String{ R"(
|
|
{
|
|
"name" : "profile2"
|
|
})" };
|
|
|
|
const auto profile0Json = VerifyParseSucceeded(profile0String);
|
|
const auto profile1Json = VerifyParseSucceeded(profile1String);
|
|
const auto profile2Json = VerifyParseSucceeded(profile2String);
|
|
const auto profile3Json = VerifyParseSucceeded(profile3String);
|
|
const auto profile4Json = VerifyParseSucceeded(profile4String);
|
|
const auto profile5Json = VerifyParseSucceeded(profile5String);
|
|
|
|
const auto profile0 = Profile::FromJson(profile0Json);
|
|
const auto profile1 = Profile::FromJson(profile1Json);
|
|
const auto profile2 = Profile::FromJson(profile2Json);
|
|
const auto profile3 = Profile::FromJson(profile3Json);
|
|
const auto profile4 = Profile::FromJson(profile4Json);
|
|
const auto profile5 = Profile::FromJson(profile5Json);
|
|
|
|
const GUID cmdGuid = Utils::GuidFromString(L"{6239a42c-1de4-49a3-80bd-e8fdd045185c}");
|
|
const GUID nullGuid{ 0 };
|
|
|
|
VERIFY_IS_FALSE(profile0._guid.has_value());
|
|
VERIFY_IS_FALSE(profile1._guid.has_value());
|
|
VERIFY_IS_FALSE(profile2._guid.has_value());
|
|
VERIFY_IS_TRUE(profile3._guid.has_value());
|
|
VERIFY_IS_TRUE(profile4._guid.has_value());
|
|
VERIFY_IS_FALSE(profile5._guid.has_value());
|
|
|
|
VERIFY_ARE_EQUAL(profile3.GetGuid(), nullGuid);
|
|
VERIFY_ARE_EQUAL(profile4.GetGuid(), cmdGuid);
|
|
|
|
CascadiaSettings settings;
|
|
settings._profiles.emplace_back(profile0);
|
|
settings._profiles.emplace_back(profile1);
|
|
settings._profiles.emplace_back(profile2);
|
|
settings._profiles.emplace_back(profile3);
|
|
settings._profiles.emplace_back(profile4);
|
|
settings._profiles.emplace_back(profile5);
|
|
|
|
settings._ValidateProfilesHaveGuid();
|
|
VERIFY_IS_TRUE(settings._profiles.at(0)._guid.has_value());
|
|
VERIFY_IS_TRUE(settings._profiles.at(1)._guid.has_value());
|
|
VERIFY_IS_TRUE(settings._profiles.at(2)._guid.has_value());
|
|
VERIFY_IS_TRUE(settings._profiles.at(3)._guid.has_value());
|
|
VERIFY_IS_TRUE(settings._profiles.at(4)._guid.has_value());
|
|
VERIFY_IS_TRUE(settings._profiles.at(5)._guid.has_value());
|
|
|
|
VERIFY_ARE_NOT_EQUAL(settings._profiles.at(0).GetGuid(), nullGuid);
|
|
VERIFY_ARE_NOT_EQUAL(settings._profiles.at(1).GetGuid(), nullGuid);
|
|
VERIFY_ARE_NOT_EQUAL(settings._profiles.at(2).GetGuid(), nullGuid);
|
|
VERIFY_ARE_EQUAL(settings._profiles.at(3).GetGuid(), nullGuid);
|
|
VERIFY_ARE_NOT_EQUAL(settings._profiles.at(4).GetGuid(), nullGuid);
|
|
VERIFY_ARE_NOT_EQUAL(settings._profiles.at(5).GetGuid(), nullGuid);
|
|
|
|
VERIFY_ARE_NOT_EQUAL(settings._profiles.at(0).GetGuid(), cmdGuid);
|
|
VERIFY_ARE_NOT_EQUAL(settings._profiles.at(1).GetGuid(), cmdGuid);
|
|
VERIFY_ARE_NOT_EQUAL(settings._profiles.at(2).GetGuid(), cmdGuid);
|
|
VERIFY_ARE_NOT_EQUAL(settings._profiles.at(3).GetGuid(), cmdGuid);
|
|
VERIFY_ARE_EQUAL(settings._profiles.at(4).GetGuid(), cmdGuid);
|
|
VERIFY_ARE_NOT_EQUAL(settings._profiles.at(5).GetGuid(), cmdGuid);
|
|
|
|
VERIFY_ARE_NOT_EQUAL(settings._profiles.at(0).GetGuid(), settings._profiles.at(2).GetGuid());
|
|
VERIFY_ARE_NOT_EQUAL(settings._profiles.at(1).GetGuid(), settings._profiles.at(2).GetGuid());
|
|
VERIFY_ARE_EQUAL(settings._profiles.at(2).GetGuid(), settings._profiles.at(2).GetGuid());
|
|
VERIFY_ARE_NOT_EQUAL(settings._profiles.at(3).GetGuid(), settings._profiles.at(2).GetGuid());
|
|
VERIFY_ARE_NOT_EQUAL(settings._profiles.at(4).GetGuid(), settings._profiles.at(2).GetGuid());
|
|
VERIFY_ARE_EQUAL(settings._profiles.at(5).GetGuid(), settings._profiles.at(2).GetGuid());
|
|
}
|
|
|
|
void SettingsTests::GeneratedGuidRoundtrips()
|
|
{
|
|
// Parse a profile without a guid.
|
|
// We should automatically generate a GUID for that profile.
|
|
// When that profile is serialized and deserialized again, the GUID we
|
|
// generated for it should persist.
|
|
const std::string profileWithoutGuid{ R"({
|
|
"name" : "profile0"
|
|
})" };
|
|
const auto profile0Json = VerifyParseSucceeded(profileWithoutGuid);
|
|
|
|
const auto profile0 = Profile::FromJson(profile0Json);
|
|
const GUID nullGuid{ 0 };
|
|
|
|
VERIFY_IS_FALSE(profile0._guid.has_value());
|
|
|
|
const auto serialized0Profile = profile0.ToJson();
|
|
const auto profile1 = Profile::FromJson(serialized0Profile);
|
|
VERIFY_IS_FALSE(profile0._guid.has_value());
|
|
VERIFY_ARE_EQUAL(profile1._guid.has_value(), profile0._guid.has_value());
|
|
|
|
CascadiaSettings settings;
|
|
settings._profiles.emplace_back(profile1);
|
|
settings._ValidateProfilesHaveGuid();
|
|
|
|
VERIFY_IS_TRUE(settings._profiles.at(0)._guid.has_value());
|
|
|
|
const auto serialized1Profile = settings._profiles.at(0).ToJson();
|
|
|
|
const auto profile2 = Profile::FromJson(serialized1Profile);
|
|
VERIFY_IS_TRUE(settings._profiles.at(0)._guid.has_value());
|
|
VERIFY_ARE_EQUAL(settings._profiles.at(0)._guid.has_value(), profile2._guid.has_value());
|
|
VERIFY_ARE_EQUAL(settings._profiles.at(0).GetGuid(), profile2.GetGuid());
|
|
}
|
|
|
|
void SettingsTests::TestAllValidationsWithNullGuids()
|
|
{
|
|
const std::string settings0String{ R"(
|
|
{
|
|
"defaultProfile": "{6239a42c-1111-49a3-80bd-e8fdd045185c}",
|
|
"profiles": [
|
|
{
|
|
"name" : "profile0",
|
|
"guid" : "{6239a42c-1111-49a3-80bd-e8fdd045185c}"
|
|
},
|
|
{
|
|
"name" : "profile1"
|
|
}
|
|
]
|
|
})" };
|
|
|
|
const auto settings0Json = VerifyParseSucceeded(settings0String);
|
|
|
|
CascadiaSettings settings;
|
|
settings._LayerJsonString(settings0String, false);
|
|
|
|
VERIFY_ARE_EQUAL(2u, settings._profiles.size());
|
|
VERIFY_IS_TRUE(settings._profiles.at(0)._guid.has_value());
|
|
VERIFY_IS_FALSE(settings._profiles.at(1)._guid.has_value());
|
|
|
|
settings._ValidateSettings();
|
|
VERIFY_ARE_EQUAL(0u, settings._warnings.size());
|
|
VERIFY_ARE_EQUAL(2u, settings._profiles.size());
|
|
VERIFY_IS_TRUE(settings._profiles.at(0)._guid.has_value());
|
|
VERIFY_IS_TRUE(settings._profiles.at(1)._guid.has_value());
|
|
}
|
|
|
|
void SettingsTests::TestReorderWithNullGuids()
|
|
{
|
|
const std::string settings0String{ R"(
|
|
{
|
|
"defaultProfile": "{6239a42c-1111-49a3-80bd-e8fdd045185c}",
|
|
"profiles": [
|
|
{
|
|
"name" : "profile0",
|
|
"guid" : "{6239a42c-1111-49a3-80bd-e8fdd045185c}"
|
|
},
|
|
{
|
|
"name" : "profile1"
|
|
},
|
|
{
|
|
"name" : "cmdFromUserSettings",
|
|
"guid" : "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}" // from defaults.json
|
|
}
|
|
]
|
|
})" };
|
|
|
|
const auto settings0Json = VerifyParseSucceeded(settings0String);
|
|
|
|
CascadiaSettings settings;
|
|
settings._LayerJsonString(DefaultJson, true);
|
|
VERIFY_ARE_EQUAL(2u, settings._profiles.size());
|
|
VERIFY_IS_TRUE(settings._profiles.at(0)._guid.has_value());
|
|
VERIFY_IS_TRUE(settings._profiles.at(1)._guid.has_value());
|
|
VERIFY_ARE_EQUAL(L"Windows PowerShell", settings._profiles.at(0)._name);
|
|
VERIFY_ARE_EQUAL(L"cmd", settings._profiles.at(1)._name);
|
|
|
|
settings._LayerJsonString(settings0String, false);
|
|
|
|
VERIFY_ARE_EQUAL(4u, settings._profiles.size());
|
|
VERIFY_IS_TRUE(settings._profiles.at(0)._guid.has_value());
|
|
VERIFY_IS_TRUE(settings._profiles.at(1)._guid.has_value());
|
|
VERIFY_IS_TRUE(settings._profiles.at(2)._guid.has_value());
|
|
VERIFY_IS_FALSE(settings._profiles.at(3)._guid.has_value());
|
|
VERIFY_ARE_EQUAL(L"Windows PowerShell", settings._profiles.at(0)._name);
|
|
VERIFY_ARE_EQUAL(L"cmdFromUserSettings", settings._profiles.at(1)._name);
|
|
VERIFY_ARE_EQUAL(L"profile0", settings._profiles.at(2)._name);
|
|
VERIFY_ARE_EQUAL(L"profile1", settings._profiles.at(3)._name);
|
|
|
|
settings._ValidateSettings();
|
|
VERIFY_ARE_EQUAL(0u, settings._warnings.size());
|
|
VERIFY_ARE_EQUAL(4u, settings._profiles.size());
|
|
VERIFY_IS_TRUE(settings._profiles.at(0)._guid.has_value());
|
|
VERIFY_IS_TRUE(settings._profiles.at(1)._guid.has_value());
|
|
VERIFY_IS_TRUE(settings._profiles.at(2)._guid.has_value());
|
|
VERIFY_IS_TRUE(settings._profiles.at(3)._guid.has_value());
|
|
VERIFY_ARE_EQUAL(L"profile0", settings._profiles.at(0)._name);
|
|
VERIFY_ARE_EQUAL(L"profile1", settings._profiles.at(1)._name);
|
|
VERIFY_ARE_EQUAL(L"cmdFromUserSettings", settings._profiles.at(2)._name);
|
|
VERIFY_ARE_EQUAL(L"Windows PowerShell", settings._profiles.at(3)._name);
|
|
}
|
|
|
|
void SettingsTests::TestReorderingWithoutGuid()
|
|
{
|
|
Log::Comment(NoThrowString().Format(
|
|
L"During the GH#2515 PR, this set of settings was found to cause an"
|
|
L" exception, crashing the terminal. This test ensures that it doesn't."));
|
|
|
|
Log::Comment(NoThrowString().Format(
|
|
L"While similar to TestReorderWithNullGuids, there's something else"
|
|
L" about this scenario specifically that causes a crash, when "
|
|
L" TestReorderWithNullGuids did _not_."));
|
|
|
|
const std::string settings0String{ R"(
|
|
{
|
|
"defaultProfile" : "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
|
|
"profiles": [
|
|
{
|
|
"guid" : "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
|
|
"acrylicOpacity" : 0.5,
|
|
"closeOnExit" : true,
|
|
"background" : "#8A00FF",
|
|
"foreground" : "#F2F2F2",
|
|
"commandline" : "cmd.exe",
|
|
"cursorColor" : "#FFFFFF",
|
|
"fontFace" : "Cascadia Code",
|
|
"fontSize" : 10,
|
|
"historySize" : 9001,
|
|
"padding" : "20",
|
|
"snapOnInput" : true,
|
|
"startingDirectory" : "%USERPROFILE%",
|
|
"useAcrylic" : true
|
|
},
|
|
{
|
|
"name" : "ThisProfileShouldNotCrash",
|
|
"tabTitle" : "Ubuntu",
|
|
"acrylicOpacity" : 0.5,
|
|
"background" : "#2C001E",
|
|
"closeOnExit" : true,
|
|
"colorScheme" : "Campbell",
|
|
"commandline" : "wsl.exe",
|
|
"cursorColor" : "#FFFFFF",
|
|
"cursorShape" : "bar",
|
|
"fontSize" : 10,
|
|
"historySize" : 9001,
|
|
"padding" : "0, 0, 0, 0",
|
|
"snapOnInput" : true,
|
|
"useAcrylic" : true
|
|
},
|
|
{
|
|
// This is the same profile that would be generated by the WSL profile generator.
|
|
"name" : "Ubuntu",
|
|
"guid" : "{2C4DE342-38B7-51CF-B940-2309A097F518}",
|
|
"acrylicOpacity" : 0.5,
|
|
"background" : "#2C001E",
|
|
"closeOnExit" : false,
|
|
"cursorColor" : "#FFFFFF",
|
|
"cursorShape" : "bar",
|
|
"fontSize" : 10,
|
|
"historySize" : 9001,
|
|
"snapOnInput" : true,
|
|
"useAcrylic" : true
|
|
}
|
|
]
|
|
})" };
|
|
|
|
const auto settings0Json = VerifyParseSucceeded(settings0String);
|
|
|
|
CascadiaSettings settings;
|
|
settings._LayerJsonString(DefaultJson, true);
|
|
VERIFY_ARE_EQUAL(2u, settings._profiles.size());
|
|
VERIFY_IS_TRUE(settings._profiles.at(0)._guid.has_value());
|
|
VERIFY_IS_TRUE(settings._profiles.at(1)._guid.has_value());
|
|
VERIFY_ARE_EQUAL(L"Windows PowerShell", settings._profiles.at(0)._name);
|
|
VERIFY_ARE_EQUAL(L"cmd", settings._profiles.at(1)._name);
|
|
|
|
settings._LayerJsonString(settings0String, false);
|
|
|
|
VERIFY_ARE_EQUAL(4u, settings._profiles.size());
|
|
VERIFY_IS_TRUE(settings._profiles.at(0)._guid.has_value());
|
|
VERIFY_IS_TRUE(settings._profiles.at(1)._guid.has_value());
|
|
VERIFY_IS_FALSE(settings._profiles.at(2)._guid.has_value());
|
|
VERIFY_IS_TRUE(settings._profiles.at(3)._guid.has_value());
|
|
VERIFY_ARE_EQUAL(L"Windows PowerShell", settings._profiles.at(0)._name);
|
|
VERIFY_ARE_EQUAL(L"cmd", settings._profiles.at(1)._name);
|
|
VERIFY_ARE_EQUAL(L"ThisProfileShouldNotCrash", settings._profiles.at(2)._name);
|
|
VERIFY_ARE_EQUAL(L"Ubuntu", settings._profiles.at(3)._name);
|
|
|
|
settings._ValidateSettings();
|
|
VERIFY_ARE_EQUAL(0u, settings._warnings.size());
|
|
VERIFY_ARE_EQUAL(4u, settings._profiles.size());
|
|
VERIFY_IS_TRUE(settings._profiles.at(0)._guid.has_value());
|
|
VERIFY_IS_TRUE(settings._profiles.at(1)._guid.has_value());
|
|
VERIFY_IS_TRUE(settings._profiles.at(2)._guid.has_value());
|
|
VERIFY_IS_TRUE(settings._profiles.at(3)._guid.has_value());
|
|
VERIFY_ARE_EQUAL(L"cmd", settings._profiles.at(0)._name);
|
|
VERIFY_ARE_EQUAL(L"ThisProfileShouldNotCrash", settings._profiles.at(1)._name);
|
|
VERIFY_ARE_EQUAL(L"Ubuntu", settings._profiles.at(2)._name);
|
|
VERIFY_ARE_EQUAL(L"Windows PowerShell", settings._profiles.at(3)._name);
|
|
}
|
|
}
|