Fix most unit tests
This commit is contained in:
parent
20b91fbbc3
commit
64896e55b7
|
@ -5,6 +5,7 @@
|
|||
|
||||
#include "../TerminalSettingsModel/ColorScheme.h"
|
||||
#include "../TerminalSettingsModel/CascadiaSettings.h"
|
||||
#include "../types/inc/colorTable.hpp"
|
||||
#include "JsonTestClass.h"
|
||||
|
||||
using namespace Microsoft::Console;
|
||||
|
@ -33,6 +34,7 @@ namespace SettingsModelLocalTests
|
|||
TEST_CLASS_PROPERTY(L"UAP:AppXManifest", L"TestHostAppXManifest.xml")
|
||||
END_TEST_CLASS()
|
||||
|
||||
TEST_METHOD(ParseSimpleColorScheme);
|
||||
TEST_METHOD(LayerColorSchemesOnArray);
|
||||
TEST_METHOD(UpdateSchemeReferences);
|
||||
|
||||
|
@ -42,6 +44,57 @@ namespace SettingsModelLocalTests
|
|||
}
|
||||
};
|
||||
|
||||
void ColorSchemeTests::ParseSimpleColorScheme()
|
||||
{
|
||||
const std::string campbellScheme{ "{"
|
||||
"\"background\" : \"#0C0C0C\","
|
||||
"\"black\" : \"#0C0C0C\","
|
||||
"\"blue\" : \"#0037DA\","
|
||||
"\"brightBlack\" : \"#767676\","
|
||||
"\"brightBlue\" : \"#3B78FF\","
|
||||
"\"brightCyan\" : \"#61D6D6\","
|
||||
"\"brightGreen\" : \"#16C60C\","
|
||||
"\"brightPurple\" : \"#B4009E\","
|
||||
"\"brightRed\" : \"#E74856\","
|
||||
"\"brightWhite\" : \"#F2F2F2\","
|
||||
"\"brightYellow\" : \"#F9F1A5\","
|
||||
"\"cursorColor\" : \"#FFFFFF\","
|
||||
"\"cyan\" : \"#3A96DD\","
|
||||
"\"foreground\" : \"#F2F2F2\","
|
||||
"\"green\" : \"#13A10E\","
|
||||
"\"name\" : \"Campbell\","
|
||||
"\"purple\" : \"#881798\","
|
||||
"\"red\" : \"#C50F1F\","
|
||||
"\"selectionBackground\" : \"#131313\","
|
||||
"\"white\" : \"#CCCCCC\","
|
||||
"\"yellow\" : \"#C19C00\""
|
||||
"}" };
|
||||
|
||||
const auto schemeObject = VerifyParseSucceeded(campbellScheme);
|
||||
auto scheme = ColorScheme::FromJson(schemeObject);
|
||||
VERIFY_ARE_EQUAL(L"Campbell", scheme->Name());
|
||||
VERIFY_ARE_EQUAL(til::color(0xf2, 0xf2, 0xf2, 255), til::color{ scheme->Foreground() });
|
||||
VERIFY_ARE_EQUAL(til::color(0x0c, 0x0c, 0x0c, 255), til::color{ scheme->Background() });
|
||||
VERIFY_ARE_EQUAL(til::color(0x13, 0x13, 0x13, 255), til::color{ scheme->SelectionBackground() });
|
||||
VERIFY_ARE_EQUAL(til::color(0xFF, 0xFF, 0xFF, 255), til::color{ scheme->CursorColor() });
|
||||
|
||||
std::array<COLORREF, COLOR_TABLE_SIZE> expectedCampbellTable;
|
||||
const auto campbellSpan = gsl::make_span(expectedCampbellTable);
|
||||
Utils::InitializeCampbellColorTable(campbellSpan);
|
||||
Utils::SetColorTableAlpha(campbellSpan, 0);
|
||||
|
||||
for (size_t i = 0; i < expectedCampbellTable.size(); i++)
|
||||
{
|
||||
const auto& expected = expectedCampbellTable.at(i);
|
||||
const til::color actual{ scheme->Table().at(static_cast<uint32_t>(i)) };
|
||||
VERIFY_ARE_EQUAL(expected, actual);
|
||||
}
|
||||
|
||||
Log::Comment(L"Roundtrip Test for Color Scheme");
|
||||
Json::Value outJson{ scheme->ToJson() };
|
||||
VERIFY_ARE_EQUAL(schemeObject, outJson);
|
||||
}
|
||||
|
||||
void ColorSchemeTests::LayerColorSchemesOnArray()
|
||||
{
|
||||
static constexpr std::string_view inboxSettings{ R"({
|
||||
|
|
|
@ -7,6 +7,8 @@
|
|||
#include "../TerminalSettingsModel/CascadiaSettings.h"
|
||||
#include "JsonTestClass.h"
|
||||
|
||||
#include <defaults.h>
|
||||
|
||||
using namespace Microsoft::Console;
|
||||
using namespace winrt::Microsoft::Terminal::Settings::Model;
|
||||
using namespace WEX::Logging;
|
||||
|
@ -32,12 +34,74 @@ namespace SettingsModelLocalTests
|
|||
TEST_CLASS_PROPERTY(L"UAP:AppXManifest", L"TestHostAppXManifest.xml")
|
||||
END_TEST_CLASS()
|
||||
|
||||
TEST_METHOD(ProfileGeneratesGuid);
|
||||
TEST_METHOD(LayerProfileProperties);
|
||||
TEST_METHOD(LayerProfileIcon);
|
||||
TEST_METHOD(LayerProfilesOnArray);
|
||||
TEST_METHOD(DuplicateProfileTest);
|
||||
|
||||
// Make sure we gen GUIDs for profiles without guids
|
||||
TEST_METHOD(TestGenGuidsForProfiles);
|
||||
// Make sure disabledProfileSources removes profiles with any of the given sources.
|
||||
TEST_METHOD(TestDisabledProfileSources);
|
||||
};
|
||||
|
||||
void ProfileTests::ProfileGeneratesGuid()
|
||||
{
|
||||
// Parse some profiles without guids. We should NOT generate new guids
|
||||
// for them. If a profile doesn't have a GUID, we'll leave its _guid
|
||||
// set to nullopt. The Profile::Guid() getter will
|
||||
// ensure all profiles have a GUID that's actually set.
|
||||
// The null guid _is_ a valid guid, so we won't re-generate that
|
||||
// guid. null is _not_ a valid guid, so we'll leave that nullopt
|
||||
|
||||
// See SettingsTests::ValidateProfilesGenerateGuids for a version of
|
||||
// this test that includes synthesizing GUIDS for profiles without GUIDs
|
||||
// set
|
||||
|
||||
const std::string profileWithoutGuid{ R"({
|
||||
"name" : "profile0"
|
||||
})" };
|
||||
const std::string secondProfileWithoutGuid{ R"({
|
||||
"name" : "profile1"
|
||||
})" };
|
||||
const std::string profileWithNullForGuid{ R"({
|
||||
"name" : "profile2",
|
||||
"guid" : null
|
||||
})" };
|
||||
const std::string profileWithNullGuid{ R"({
|
||||
"name" : "profile3",
|
||||
"guid" : "{00000000-0000-0000-0000-000000000000}"
|
||||
})" };
|
||||
const std::string profileWithGuid{ R"({
|
||||
"name" : "profile4",
|
||||
"guid" : "{6239a42c-1de4-49a3-80bd-e8fdd045185c}"
|
||||
})" };
|
||||
|
||||
const auto profile0Json = VerifyParseSucceeded(profileWithoutGuid);
|
||||
const auto profile1Json = VerifyParseSucceeded(secondProfileWithoutGuid);
|
||||
const auto profile2Json = VerifyParseSucceeded(profileWithNullForGuid);
|
||||
const auto profile3Json = VerifyParseSucceeded(profileWithNullGuid);
|
||||
const auto profile4Json = VerifyParseSucceeded(profileWithGuid);
|
||||
|
||||
const auto profile0 = implementation::Profile::FromJson(profile0Json);
|
||||
const auto profile1 = implementation::Profile::FromJson(profile1Json);
|
||||
const auto profile2 = implementation::Profile::FromJson(profile2Json);
|
||||
const auto profile3 = implementation::Profile::FromJson(profile3Json);
|
||||
const auto profile4 = implementation::Profile::FromJson(profile4Json);
|
||||
const winrt::guid cmdGuid = Utils::GuidFromString(L"{6239a42c-1de4-49a3-80bd-e8fdd045185c}");
|
||||
const winrt::guid nullGuid{};
|
||||
|
||||
VERIFY_IS_FALSE(profile0->HasGuid());
|
||||
VERIFY_IS_FALSE(profile1->HasGuid());
|
||||
VERIFY_IS_FALSE(profile2->HasGuid());
|
||||
VERIFY_IS_TRUE(profile3->HasGuid());
|
||||
VERIFY_IS_TRUE(profile4->HasGuid());
|
||||
|
||||
VERIFY_ARE_EQUAL(profile3->Guid(), nullGuid);
|
||||
VERIFY_ARE_EQUAL(profile4->Guid(), cmdGuid);
|
||||
}
|
||||
|
||||
void ProfileTests::LayerProfileProperties()
|
||||
{
|
||||
static constexpr std::string_view profile0String{ R"({
|
||||
|
@ -233,4 +297,80 @@ namespace SettingsModelLocalTests
|
|||
const auto duplicatedJson = winrt::get_self<implementation::Profile>(duplicatedProfile)->ToJson();
|
||||
VERIFY_ARE_EQUAL(json, duplicatedJson, til::u8u16(toString(duplicatedJson)).c_str());
|
||||
}
|
||||
|
||||
void ProfileTests::TestGenGuidsForProfiles()
|
||||
{
|
||||
// We'll generate GUIDs in the Profile::Guid getter. We should make sure that
|
||||
// the GUID generated for a dynamic profile (with a source) is different
|
||||
// than that of a profile without a source.
|
||||
|
||||
static constexpr std::string_view userSettings{ R"({
|
||||
"profiles": [
|
||||
{
|
||||
"name": "profile0",
|
||||
"source": "Terminal.App.UnitTest.0",
|
||||
},
|
||||
{
|
||||
"name": "profile0"
|
||||
}
|
||||
]
|
||||
})" };
|
||||
|
||||
const auto settings = winrt::make_self<implementation::CascadiaSettings>(userSettings, DefaultJson);
|
||||
|
||||
VERIFY_ARE_EQUAL(4u, settings->AllProfiles().Size());
|
||||
|
||||
VERIFY_ARE_EQUAL(L"profile0", settings->AllProfiles().GetAt(0).Name());
|
||||
VERIFY_IS_TRUE(settings->AllProfiles().GetAt(0).HasGuid());
|
||||
VERIFY_IS_FALSE(settings->AllProfiles().GetAt(0).Source().empty());
|
||||
|
||||
VERIFY_ARE_EQUAL(L"profile0", settings->AllProfiles().GetAt(1).Name());
|
||||
VERIFY_IS_TRUE(settings->AllProfiles().GetAt(1).HasGuid());
|
||||
VERIFY_IS_TRUE(settings->AllProfiles().GetAt(1).Source().empty());
|
||||
|
||||
VERIFY_ARE_NOT_EQUAL(settings->AllProfiles().GetAt(0).Guid(), settings->AllProfiles().GetAt(1).Guid());
|
||||
}
|
||||
|
||||
void ProfileTests::TestDisabledProfileSources()
|
||||
{
|
||||
static constexpr std::string_view inboxSettings{ R"({
|
||||
"profiles": [
|
||||
{
|
||||
"name": "profile0",
|
||||
"source": "Terminal.App.UnitTest.0"
|
||||
},
|
||||
{
|
||||
"name": "profile1",
|
||||
"source": "Terminal.App.UnitTest.1"
|
||||
},
|
||||
{
|
||||
"name": "profile2",
|
||||
"source": "Terminal.App.UnitTest.1"
|
||||
},
|
||||
{
|
||||
"name": "profile3",
|
||||
"source": "Terminal.App.UnitTest.2"
|
||||
}
|
||||
]
|
||||
})" };
|
||||
static constexpr std::string_view userSettings{ R"({
|
||||
"disabledProfileSources": ["Terminal.App.UnitTest.0", "Terminal.App.UnitTest.2"],
|
||||
"profiles": [
|
||||
{
|
||||
"name": "profile4",
|
||||
"source": "Terminal.App.UnitTest.2"
|
||||
}
|
||||
]
|
||||
})" };
|
||||
|
||||
const auto settings = winrt::make_self<implementation::CascadiaSettings>(userSettings, inboxSettings);
|
||||
|
||||
VERIFY_ARE_EQUAL(2u, settings->AllProfiles().Size());
|
||||
VERIFY_IS_FALSE(settings->AllProfiles().GetAt(0).Source().empty());
|
||||
VERIFY_IS_FALSE(settings->AllProfiles().GetAt(1).Source().empty());
|
||||
VERIFY_ARE_EQUAL(L"Terminal.App.UnitTest.1", settings->AllProfiles().GetAt(0).Source());
|
||||
VERIFY_ARE_EQUAL(L"Terminal.App.UnitTest.1", settings->AllProfiles().GetAt(1).Source());
|
||||
VERIFY_ARE_EQUAL(L"profile1", settings->AllProfiles().GetAt(0).Name());
|
||||
VERIFY_ARE_EQUAL(L"profile2", settings->AllProfiles().GetAt(1).Name());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -230,8 +230,9 @@ void GlobalAppSettings::LayerJson(const Json::Value& json)
|
|||
// This is a helper lambda to get the keybindings and commands out of both
|
||||
// and array of objects. We'll use this twice, once on the legacy
|
||||
// `keybindings` key, and again on the newer `bindings` key.
|
||||
static constexpr std::array bindingsKeys{LegacyKeybindingsKey, ActionsKey};
|
||||
for (const auto& jsonKey : bindingsKeys) {
|
||||
static constexpr std::array bindingsKeys{ LegacyKeybindingsKey, ActionsKey };
|
||||
for (const auto& jsonKey : bindingsKeys)
|
||||
{
|
||||
if (auto bindings{ json[JsonKey(jsonKey)] })
|
||||
{
|
||||
auto warnings = _actionMap->LayerJson(bindings);
|
||||
|
|
|
@ -1,665 +0,0 @@
|
|||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
#include "precomp.h"
|
||||
|
||||
#include "../TerminalSettingsModel/ColorScheme.h"
|
||||
#include "../TerminalSettingsModel/Profile.h"
|
||||
#include "../TerminalSettingsModel/CascadiaSettings.h"
|
||||
#include "../TerminalSettingsModel/LegacyProfileGeneratorNamespaces.h"
|
||||
|
||||
#include "../LocalTests_SettingsModel/JsonTestClass.h"
|
||||
|
||||
#include "TestDynamicProfileGenerator.h"
|
||||
|
||||
using namespace Microsoft::Console;
|
||||
using namespace winrt::Microsoft::Terminal::Settings::Model;
|
||||
using namespace WEX::Logging;
|
||||
using namespace WEX::TestExecution;
|
||||
using namespace WEX::Common;
|
||||
|
||||
namespace TerminalAppUnitTests
|
||||
{
|
||||
class DynamicProfileTests : public JsonTestClass
|
||||
{
|
||||
BEGIN_TEST_CLASS(DynamicProfileTests)
|
||||
TEST_CLASS_PROPERTY(L"ActivationContext", L"TerminalApp.Unit.Tests.manifest")
|
||||
END_TEST_CLASS()
|
||||
|
||||
TEST_METHOD(TestSimpleGenerate);
|
||||
|
||||
// Simple test of CascadiaSettings generating profiles with _LoadDynamicProfiles
|
||||
TEST_METHOD(TestSimpleGenerateMultipleGenerators);
|
||||
|
||||
// Make sure we gen GUIDs for profiles without guids
|
||||
TEST_METHOD(TestGenGuidsForProfiles);
|
||||
|
||||
// Profiles without a source should not be layered on those with one
|
||||
TEST_METHOD(DontLayerUserProfilesOnDynamicProfiles);
|
||||
TEST_METHOD(DoLayerUserProfilesOnDynamicsWhenSourceMatches);
|
||||
|
||||
// Make sure profiles that are disabled in _userSettings don't get generated
|
||||
TEST_METHOD(TestDontRunDisabledGenerators);
|
||||
|
||||
// Make sure profiles that are disabled in _userSettings don't get generated
|
||||
TEST_METHOD(TestLegacyProfilesMigrate);
|
||||
|
||||
// Both these do similar things:
|
||||
// This makes sure that a profile with a `source` _only_ layers, it won't create a new profile
|
||||
TEST_METHOD(UserProfilesWithInvalidSourcesAreIgnored);
|
||||
// This does the same, but by disabling a profile source
|
||||
TEST_METHOD(UserProfilesFromDisabledSourcesDontAppear);
|
||||
};
|
||||
|
||||
void DynamicProfileTests::TestSimpleGenerate()
|
||||
{
|
||||
TestDynamicProfileGenerator gen{ L"Terminal.App.UnitTest", [](std::vector<Profile>& profiles) {
|
||||
auto p0 = winrt::make_self<Profile>();
|
||||
p0.Name(L"profile0");
|
||||
profiles.emplace_back(std::move(p0));
|
||||
} };
|
||||
|
||||
VERIFY_ARE_EQUAL(L"Terminal.App.UnitTest", gen.GetNamespace());
|
||||
std::vector<Profile> profiles;
|
||||
gen.GenerateProfiles(profiles);
|
||||
VERIFY_ARE_EQUAL(1u, profiles.size());
|
||||
VERIFY_ARE_EQUAL(L"profile0", profiles.at(0).Name());
|
||||
VERIFY_IS_FALSE(profiles.at(0).HasGuid());
|
||||
}
|
||||
|
||||
void DynamicProfileTests::TestSimpleGenerateMultipleGenerators()
|
||||
{
|
||||
auto gen0 = std::make_unique<TestDynamicProfileGenerator>(L"Terminal.App.UnitTest.0");
|
||||
gen0->pfnGenerate = []() {
|
||||
std::vector<Profile> profiles;
|
||||
Profile p0;
|
||||
p0.Name(L"profile0");
|
||||
profiles.push_back(p0);
|
||||
return profiles;
|
||||
};
|
||||
auto gen1 = std::make_unique<TestDynamicProfileGenerator>(L"Terminal.App.UnitTest.1");
|
||||
gen1->pfnGenerate = []() {
|
||||
std::vector<Profile> profiles;
|
||||
Profile p0;
|
||||
p0.Name(L"profile1");
|
||||
profiles.push_back(p0);
|
||||
return profiles;
|
||||
};
|
||||
|
||||
auto settings = winrt::make_self<implementation::CascadiaSettings>(false);
|
||||
settings->_profileGenerators.emplace_back(std::move(gen0));
|
||||
settings->_profileGenerators.emplace_back(std::move(gen1));
|
||||
|
||||
settings->_LoadDynamicProfiles();
|
||||
VERIFY_ARE_EQUAL(2u, settings->_allProfiles.Size());
|
||||
|
||||
VERIFY_ARE_EQUAL(L"profile0", settings->_allProfiles.GetAt(0).Name());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(0).HasGuid());
|
||||
|
||||
VERIFY_ARE_EQUAL(L"profile1", settings->_allProfiles.GetAt(1).Name());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(1).HasGuid());
|
||||
}
|
||||
|
||||
void DynamicProfileTests::TestGenGuidsForProfiles()
|
||||
{
|
||||
// We'll generate GUIDs in the Profile::Guid getter. We should make sure that
|
||||
// the GUID generated for a dynamic profile (with a source) is different
|
||||
// than that of a profile without a source.
|
||||
|
||||
auto gen0 = std::make_unique<TestDynamicProfileGenerator>(L"Terminal.App.UnitTest.0");
|
||||
gen0->pfnGenerate = []() {
|
||||
std::vector<Profile> profiles;
|
||||
Profile p0;
|
||||
p0.Name(L"profile0"); // this is _allProfiles.at(2)
|
||||
profiles.push_back(p0);
|
||||
return profiles;
|
||||
};
|
||||
auto gen1 = std::make_unique<TestDynamicProfileGenerator>(L"Terminal.App.UnitTest.1");
|
||||
gen1->pfnGenerate = []() {
|
||||
std::vector<Profile> profiles;
|
||||
Profile p0, p1;
|
||||
p0.Name(L"profile0"); // this is _allProfiles.at(3)
|
||||
p1.Name(L"profile1"); // this is _allProfiles.at(4)
|
||||
profiles.push_back(p0);
|
||||
profiles.push_back(p1);
|
||||
return profiles;
|
||||
};
|
||||
|
||||
auto settings = winrt::make_self<implementation::CascadiaSettings>(false);
|
||||
settings->_profileGenerators.emplace_back(std::move(gen0));
|
||||
settings->_profileGenerators.emplace_back(std::move(gen1));
|
||||
|
||||
Profile p0, p1;
|
||||
p0.Name(L"profile0"); // this is _allProfiles.GetAt(0)
|
||||
p1.Name(L"profile1"); // this is _allProfiles.GetAt(1)
|
||||
settings->_allProfiles.Append(p0);
|
||||
settings->_allProfiles.Append(p1);
|
||||
|
||||
settings->_LoadDynamicProfiles();
|
||||
VERIFY_ARE_EQUAL(5u, settings->_allProfiles.Size());
|
||||
|
||||
VERIFY_ARE_EQUAL(L"profile0", settings->_allProfiles.GetAt(0).Name());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(0).HasGuid());
|
||||
VERIFY_IS_TRUE(settings->_allProfiles.GetAt(0).Source().empty());
|
||||
|
||||
VERIFY_ARE_EQUAL(L"profile1", settings->_allProfiles.GetAt(1).Name());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(1).HasGuid());
|
||||
VERIFY_IS_TRUE(settings->_allProfiles.GetAt(1).Source().empty());
|
||||
|
||||
VERIFY_ARE_EQUAL(L"profile0", settings->_allProfiles.GetAt(2).Name());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(2).HasGuid());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(2).Source().empty());
|
||||
|
||||
VERIFY_ARE_EQUAL(L"profile0", settings->_allProfiles.GetAt(3).Name());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(3).HasGuid());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(3).Source().empty());
|
||||
|
||||
VERIFY_ARE_EQUAL(L"profile1", settings->_allProfiles.GetAt(4).Name());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(4).HasGuid());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(4).Source().empty());
|
||||
|
||||
VERIFY_ARE_NOT_EQUAL(settings->_allProfiles.GetAt(0).Guid(),
|
||||
settings->_allProfiles.GetAt(1).Guid());
|
||||
VERIFY_ARE_NOT_EQUAL(settings->_allProfiles.GetAt(0).Guid(),
|
||||
settings->_allProfiles.GetAt(2).Guid());
|
||||
VERIFY_ARE_NOT_EQUAL(settings->_allProfiles.GetAt(0).Guid(),
|
||||
settings->_allProfiles.GetAt(3).Guid());
|
||||
|
||||
VERIFY_ARE_NOT_EQUAL(settings->_allProfiles.GetAt(1).Guid(),
|
||||
settings->_allProfiles.GetAt(4).Guid());
|
||||
|
||||
VERIFY_ARE_NOT_EQUAL(settings->_allProfiles.GetAt(3).Guid(),
|
||||
settings->_allProfiles.GetAt(4).Guid());
|
||||
}
|
||||
|
||||
void DynamicProfileTests::DontLayerUserProfilesOnDynamicProfiles()
|
||||
{
|
||||
winrt::guid guid0 = Microsoft::Console::Utils::GuidFromString(L"{6239a42c-1111-49a3-80bd-e8fdd045185c}");
|
||||
winrt::guid guid1 = Microsoft::Console::Utils::GuidFromString(L"{6239a42c-2222-49a3-80bd-e8fdd045185c}");
|
||||
|
||||
const std::string userProfiles{ R"(
|
||||
{
|
||||
"profiles": [
|
||||
{
|
||||
"name" : "profile0",
|
||||
"guid": "{6239a42c-1111-49a3-80bd-e8fdd045185c}"
|
||||
},
|
||||
{
|
||||
"name" : "profile1",
|
||||
"guid": "{6239a42c-2222-49a3-80bd-e8fdd045185c}"
|
||||
}
|
||||
]
|
||||
})" };
|
||||
|
||||
auto gen0 = std::make_unique<TestDynamicProfileGenerator>(L"Terminal.App.UnitTest.0");
|
||||
gen0->pfnGenerate = [guid0, guid1]() {
|
||||
std::vector<Profile> profiles;
|
||||
Profile p0 = winrt::make<implementation::Profile>(guid0);
|
||||
p0.Name(L"profile0"); // this is _allProfiles.at(0)
|
||||
profiles.push_back(p0);
|
||||
return profiles;
|
||||
};
|
||||
auto gen1 = std::make_unique<TestDynamicProfileGenerator>(L"Terminal.App.UnitTest.1");
|
||||
gen1->pfnGenerate = [guid0, guid1]() {
|
||||
std::vector<Profile> profiles;
|
||||
Profile p0 = winrt::make<implementation::Profile>(guid0);
|
||||
Profile p1 = winrt::make<implementation::Profile>(guid1);
|
||||
p0.Name(L"profile0"); // this is _allProfiles.at(1)
|
||||
p1.Name(L"profile1"); // this is _allProfiles.at(2)
|
||||
profiles.push_back(p0);
|
||||
profiles.push_back(p1);
|
||||
return profiles;
|
||||
};
|
||||
|
||||
auto settings = winrt::make_self<implementation::CascadiaSettings>(false);
|
||||
settings->_profileGenerators.emplace_back(std::move(gen0));
|
||||
settings->_profileGenerators.emplace_back(std::move(gen1));
|
||||
|
||||
Log::Comment(NoThrowString().Format(
|
||||
L"All profiles with the same name have the same GUID. However, they"
|
||||
L" will not be layered, because they have different sources"));
|
||||
|
||||
// parse userProfiles as the user settings
|
||||
settings->_ParseJsonString(userProfiles, false);
|
||||
VERIFY_ARE_EQUAL(0u, settings->_allProfiles.Size(), L"Just parsing the user settings doesn't actually layer them");
|
||||
settings->_LoadDynamicProfiles();
|
||||
VERIFY_ARE_EQUAL(3u, settings->_allProfiles.Size());
|
||||
settings->LayerJson(settings->_userSettings);
|
||||
VERIFY_ARE_EQUAL(5u, settings->_allProfiles.Size());
|
||||
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(0).Source().empty());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(1).Source().empty());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(2).Source().empty());
|
||||
VERIFY_IS_TRUE(settings->_allProfiles.GetAt(3).Source().empty());
|
||||
VERIFY_IS_TRUE(settings->_allProfiles.GetAt(4).Source().empty());
|
||||
|
||||
VERIFY_ARE_EQUAL(L"Terminal.App.UnitTest.0", settings->_allProfiles.GetAt(0).Source());
|
||||
VERIFY_ARE_EQUAL(L"Terminal.App.UnitTest.1", settings->_allProfiles.GetAt(1).Source());
|
||||
VERIFY_ARE_EQUAL(L"Terminal.App.UnitTest.1", settings->_allProfiles.GetAt(2).Source());
|
||||
|
||||
VERIFY_IS_TRUE(settings->_allProfiles.GetAt(0).HasGuid());
|
||||
VERIFY_IS_TRUE(settings->_allProfiles.GetAt(1).HasGuid());
|
||||
VERIFY_IS_TRUE(settings->_allProfiles.GetAt(2).HasGuid());
|
||||
VERIFY_IS_TRUE(settings->_allProfiles.GetAt(3).HasGuid());
|
||||
VERIFY_IS_TRUE(settings->_allProfiles.GetAt(4).HasGuid());
|
||||
|
||||
VERIFY_ARE_EQUAL(guid0, settings->_allProfiles.GetAt(0).Guid());
|
||||
VERIFY_ARE_EQUAL(guid0, settings->_allProfiles.GetAt(1).Guid());
|
||||
VERIFY_ARE_EQUAL(guid1, settings->_allProfiles.GetAt(2).Guid());
|
||||
VERIFY_ARE_EQUAL(guid0, settings->_allProfiles.GetAt(3).Guid());
|
||||
VERIFY_ARE_EQUAL(guid1, settings->_allProfiles.GetAt(4).Guid());
|
||||
}
|
||||
|
||||
void DynamicProfileTests::DoLayerUserProfilesOnDynamicsWhenSourceMatches()
|
||||
{
|
||||
winrt::guid guid0 = Microsoft::Console::Utils::GuidFromString(L"{6239a42c-1111-49a3-80bd-e8fdd045185c}");
|
||||
winrt::guid guid1 = Microsoft::Console::Utils::GuidFromString(L"{6239a42c-2222-49a3-80bd-e8fdd045185c}");
|
||||
|
||||
const std::string userProfiles{ R"(
|
||||
{
|
||||
"profiles": [
|
||||
{
|
||||
"name" : "profile0FromUserSettings", // this is _allProfiles.at(0)
|
||||
"guid": "{6239a42c-1111-49a3-80bd-e8fdd045185c}",
|
||||
"source": "Terminal.App.UnitTest.0"
|
||||
},
|
||||
{
|
||||
"name" : "profile1FromUserSettings", // this is _allProfiles.at(2)
|
||||
"guid": "{6239a42c-2222-49a3-80bd-e8fdd045185c}",
|
||||
"source": "Terminal.App.UnitTest.1"
|
||||
}
|
||||
]
|
||||
})" };
|
||||
|
||||
auto gen0 = std::make_unique<TestDynamicProfileGenerator>(L"Terminal.App.UnitTest.0");
|
||||
gen0->pfnGenerate = [guid0, guid1]() {
|
||||
std::vector<Profile> profiles;
|
||||
Profile p0 = winrt::make<implementation::Profile>(guid0);
|
||||
p0.Name(L"profile0"); // this is _allProfiles.at(0)
|
||||
profiles.push_back(p0);
|
||||
return profiles;
|
||||
};
|
||||
auto gen1 = std::make_unique<TestDynamicProfileGenerator>(L"Terminal.App.UnitTest.1");
|
||||
gen1->pfnGenerate = [guid0, guid1]() {
|
||||
std::vector<Profile> profiles;
|
||||
Profile p0 = winrt::make<implementation::Profile>(guid0);
|
||||
Profile p1 = winrt::make<implementation::Profile>(guid1);
|
||||
p0.Name(L"profile0"); // this is _allProfiles.at(1)
|
||||
p1.Name(L"profile1"); // this is _allProfiles.at(2)
|
||||
profiles.push_back(p0);
|
||||
profiles.push_back(p1);
|
||||
return profiles;
|
||||
};
|
||||
|
||||
auto settings = winrt::make_self<implementation::CascadiaSettings>(false);
|
||||
settings->_profileGenerators.emplace_back(std::move(gen0));
|
||||
settings->_profileGenerators.emplace_back(std::move(gen1));
|
||||
|
||||
Log::Comment(NoThrowString().Format(
|
||||
L"All profiles with the same name have the same GUID. However, they"
|
||||
L" will not be layered, because they have different source's"));
|
||||
|
||||
// parse userProfiles as the user settings
|
||||
settings->_ParseJsonString(userProfiles, false);
|
||||
VERIFY_ARE_EQUAL(0u, settings->_allProfiles.Size(), L"Just parsing the user settings doesn't actually layer them");
|
||||
settings->_LoadDynamicProfiles();
|
||||
VERIFY_ARE_EQUAL(3u, settings->_allProfiles.Size());
|
||||
settings->LayerJson(settings->_userSettings);
|
||||
VERIFY_ARE_EQUAL(3u, settings->_allProfiles.Size());
|
||||
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(0).Source().empty());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(1).Source().empty());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(2).Source().empty());
|
||||
|
||||
VERIFY_ARE_EQUAL(L"Terminal.App.UnitTest.0", settings->_allProfiles.GetAt(0).Source());
|
||||
VERIFY_ARE_EQUAL(L"Terminal.App.UnitTest.1", settings->_allProfiles.GetAt(1).Source());
|
||||
VERIFY_ARE_EQUAL(L"Terminal.App.UnitTest.1", settings->_allProfiles.GetAt(2).Source());
|
||||
|
||||
VERIFY_IS_TRUE(settings->_allProfiles.GetAt(0).HasGuid());
|
||||
VERIFY_IS_TRUE(settings->_allProfiles.GetAt(1).HasGuid());
|
||||
VERIFY_IS_TRUE(settings->_allProfiles.GetAt(2).HasGuid());
|
||||
|
||||
VERIFY_ARE_EQUAL(guid0, settings->_allProfiles.GetAt(0).Guid());
|
||||
VERIFY_ARE_EQUAL(guid0, settings->_allProfiles.GetAt(1).Guid());
|
||||
VERIFY_ARE_EQUAL(guid1, settings->_allProfiles.GetAt(2).Guid());
|
||||
|
||||
VERIFY_ARE_EQUAL(L"profile0FromUserSettings", settings->_allProfiles.GetAt(0).Name());
|
||||
VERIFY_ARE_EQUAL(L"profile0", settings->_allProfiles.GetAt(1).Name());
|
||||
VERIFY_ARE_EQUAL(L"profile1FromUserSettings", settings->_allProfiles.GetAt(2).Name());
|
||||
}
|
||||
|
||||
void DynamicProfileTests::TestDontRunDisabledGenerators()
|
||||
{
|
||||
const std::string settings0String{ R"(
|
||||
{
|
||||
"disabledProfileSources": ["Terminal.App.UnitTest.0"]
|
||||
})" };
|
||||
const std::string settings1String{ R"(
|
||||
{
|
||||
"disabledProfileSources": ["Terminal.App.UnitTest.0", "Terminal.App.UnitTest.1"]
|
||||
})" };
|
||||
|
||||
const auto settings0Json = VerifyParseSucceeded(settings0String);
|
||||
|
||||
auto gen0GenerateFn = []() {
|
||||
std::vector<Profile> profiles;
|
||||
Profile p0;
|
||||
p0.Name(L"profile0");
|
||||
profiles.push_back(p0);
|
||||
return profiles;
|
||||
};
|
||||
|
||||
auto gen1GenerateFn = []() {
|
||||
std::vector<Profile> profiles;
|
||||
Profile p0, p1;
|
||||
p0.Name(L"profile1");
|
||||
p1.Name(L"profile2");
|
||||
profiles.push_back(p0);
|
||||
profiles.push_back(p1);
|
||||
return profiles;
|
||||
};
|
||||
|
||||
auto gen2GenerateFn = []() {
|
||||
std::vector<Profile> profiles;
|
||||
Profile p0, p1;
|
||||
p0.Name(L"profile3");
|
||||
p1.Name(L"profile4");
|
||||
profiles.push_back(p0);
|
||||
profiles.push_back(p1);
|
||||
return profiles;
|
||||
};
|
||||
|
||||
{
|
||||
Log::Comment(NoThrowString().Format(
|
||||
L"Case 1: Disable a single profile generator"));
|
||||
auto settings = winrt::make_self<implementation::CascadiaSettings>(false);
|
||||
|
||||
auto gen0 = std::make_unique<TestDynamicProfileGenerator>(L"Terminal.App.UnitTest.0");
|
||||
auto gen1 = std::make_unique<TestDynamicProfileGenerator>(L"Terminal.App.UnitTest.1");
|
||||
auto gen2 = std::make_unique<TestDynamicProfileGenerator>(L"Terminal.App.UnitTest.2");
|
||||
gen0->pfnGenerate = gen0GenerateFn;
|
||||
gen1->pfnGenerate = gen1GenerateFn;
|
||||
gen2->pfnGenerate = gen2GenerateFn;
|
||||
settings->_profileGenerators.emplace_back(std::move(gen0));
|
||||
settings->_profileGenerators.emplace_back(std::move(gen1));
|
||||
settings->_profileGenerators.emplace_back(std::move(gen2));
|
||||
|
||||
// Parse as the user settings:
|
||||
settings->_ParseJsonString(settings0String, false);
|
||||
settings->_LoadDynamicProfiles();
|
||||
|
||||
VERIFY_ARE_EQUAL(4u, settings->_allProfiles.Size());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(0).Source().empty());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(1).Source().empty());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(2).Source().empty());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(3).Source().empty());
|
||||
VERIFY_ARE_EQUAL(L"Terminal.App.UnitTest.1", settings->_allProfiles.GetAt(0).Source());
|
||||
VERIFY_ARE_EQUAL(L"Terminal.App.UnitTest.1", settings->_allProfiles.GetAt(1).Source());
|
||||
VERIFY_ARE_EQUAL(L"Terminal.App.UnitTest.2", settings->_allProfiles.GetAt(2).Source());
|
||||
VERIFY_ARE_EQUAL(L"Terminal.App.UnitTest.2", settings->_allProfiles.GetAt(3).Source());
|
||||
VERIFY_ARE_EQUAL(L"profile1", settings->_allProfiles.GetAt(0).Name());
|
||||
VERIFY_ARE_EQUAL(L"profile2", settings->_allProfiles.GetAt(1).Name());
|
||||
VERIFY_ARE_EQUAL(L"profile3", settings->_allProfiles.GetAt(2).Name());
|
||||
VERIFY_ARE_EQUAL(L"profile4", settings->_allProfiles.GetAt(3).Name());
|
||||
}
|
||||
|
||||
{
|
||||
Log::Comment(NoThrowString().Format(
|
||||
L"Case 2: Disable multiple profile generators"));
|
||||
auto settings = winrt::make_self<implementation::CascadiaSettings>(false);
|
||||
auto gen0 = std::make_unique<TestDynamicProfileGenerator>(L"Terminal.App.UnitTest.0");
|
||||
auto gen1 = std::make_unique<TestDynamicProfileGenerator>(L"Terminal.App.UnitTest.1");
|
||||
auto gen2 = std::make_unique<TestDynamicProfileGenerator>(L"Terminal.App.UnitTest.2");
|
||||
gen0->pfnGenerate = gen0GenerateFn;
|
||||
gen1->pfnGenerate = gen1GenerateFn;
|
||||
gen2->pfnGenerate = gen2GenerateFn;
|
||||
settings->_profileGenerators.emplace_back(std::move(gen0));
|
||||
settings->_profileGenerators.emplace_back(std::move(gen1));
|
||||
settings->_profileGenerators.emplace_back(std::move(gen2));
|
||||
|
||||
// Parse as the user settings:
|
||||
settings->_ParseJsonString(settings1String, false);
|
||||
settings->_LoadDynamicProfiles();
|
||||
|
||||
VERIFY_ARE_EQUAL(2u, settings->_allProfiles.Size());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(0).Source().empty());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(1).Source().empty());
|
||||
VERIFY_ARE_EQUAL(L"Terminal.App.UnitTest.2", settings->_allProfiles.GetAt(0).Source());
|
||||
VERIFY_ARE_EQUAL(L"Terminal.App.UnitTest.2", settings->_allProfiles.GetAt(1).Source());
|
||||
VERIFY_ARE_EQUAL(L"profile3", settings->_allProfiles.GetAt(0).Name());
|
||||
VERIFY_ARE_EQUAL(L"profile4", settings->_allProfiles.GetAt(1).Name());
|
||||
}
|
||||
}
|
||||
|
||||
void DynamicProfileTests::TestLegacyProfilesMigrate()
|
||||
{
|
||||
winrt::guid guid0 = Microsoft::Console::Utils::GuidFromString(L"{6239a42c-0000-49a3-80bd-e8fdd045185c}");
|
||||
winrt::guid guid1 = Microsoft::Console::Utils::GuidFromString(L"{6239a42c-1111-49a3-80bd-e8fdd045185c}");
|
||||
winrt::guid guid2 = Microsoft::Console::Utils::GuidFromString(L"{6239a42c-2222-49a3-80bd-e8fdd045185c}");
|
||||
winrt::guid guid3 = Microsoft::Console::Utils::GuidFromString(L"{6239a42c-3333-49a3-80bd-e8fdd045185c}");
|
||||
winrt::guid guid4 = Microsoft::Console::Utils::GuidFromString(L"{6239a42c-4444-49a3-80bd-e8fdd045185c}");
|
||||
|
||||
const std::string settings0String{ R"(
|
||||
{
|
||||
"profiles": [
|
||||
{
|
||||
// This pwsh profile does not have a source, but should still be layered
|
||||
"name" : "profile0FromUserSettings", // this is _allProfiles.at(0)
|
||||
"guid": "{6239a42c-0000-49a3-80bd-e8fdd045185c}"
|
||||
},
|
||||
{
|
||||
// This Azure profile does not have a source, but should still be layered
|
||||
"name" : "profile3FromUserSettings", // this is _allProfiles.at(3)
|
||||
"guid": "{6239a42c-3333-49a3-80bd-e8fdd045185c}"
|
||||
},
|
||||
{
|
||||
// This profile did not come from a dynamic source
|
||||
"name" : "profile4FromUserSettings", // this is _allProfiles.at(4)
|
||||
"guid": "{6239a42c-4444-49a3-80bd-e8fdd045185c}"
|
||||
},
|
||||
{
|
||||
// This WSL profile does not have a source, but should still be layered
|
||||
"name" : "profile1FromUserSettings", // this is _allProfiles.at(1)
|
||||
"guid": "{6239a42c-1111-49a3-80bd-e8fdd045185c}"
|
||||
},
|
||||
{
|
||||
// This WSL profile does have a source, and should be layered
|
||||
"name" : "profile2FromUserSettings", // this is _allProfiles.at(2)
|
||||
"guid": "{6239a42c-2222-49a3-80bd-e8fdd045185c}",
|
||||
"source": "Windows.Terminal.Wsl"
|
||||
}
|
||||
]
|
||||
})" };
|
||||
|
||||
auto gen0 = std::make_unique<TestDynamicProfileGenerator>(L"Windows.Terminal.PowershellCore");
|
||||
gen0->pfnGenerate = [guid0, guid1]() {
|
||||
std::vector<Profile> profiles;
|
||||
Profile p0 = winrt::make<implementation::Profile>(guid0);
|
||||
p0.Name(L"profile0");
|
||||
profiles.push_back(p0);
|
||||
return profiles;
|
||||
};
|
||||
auto gen1 = std::make_unique<TestDynamicProfileGenerator>(L"Windows.Terminal.Wsl");
|
||||
gen1->pfnGenerate = [guid2, guid1]() {
|
||||
std::vector<Profile> profiles;
|
||||
Profile p0 = winrt::make<implementation::Profile>(guid1);
|
||||
Profile p1 = winrt::make<implementation::Profile>(guid2);
|
||||
p0.Name(L"profile1");
|
||||
p1.Name(L"profile2");
|
||||
profiles.push_back(p0);
|
||||
profiles.push_back(p1);
|
||||
return profiles;
|
||||
};
|
||||
auto gen2 = std::make_unique<TestDynamicProfileGenerator>(L"Windows.Terminal.Azure");
|
||||
gen2->pfnGenerate = [guid3]() {
|
||||
std::vector<Profile> profiles;
|
||||
Profile p0 = winrt::make<implementation::Profile>(guid3);
|
||||
p0.Name(L"profile3");
|
||||
profiles.push_back(p0);
|
||||
return profiles;
|
||||
};
|
||||
|
||||
auto settings = winrt::make_self<implementation::CascadiaSettings>(false);
|
||||
settings->_profileGenerators.emplace_back(std::move(gen0));
|
||||
settings->_profileGenerators.emplace_back(std::move(gen1));
|
||||
settings->_profileGenerators.emplace_back(std::move(gen2));
|
||||
|
||||
settings->_ParseJsonString(settings0String, false);
|
||||
VERIFY_ARE_EQUAL(0u, settings->_allProfiles.Size());
|
||||
|
||||
settings->_LoadDynamicProfiles();
|
||||
VERIFY_ARE_EQUAL(4u, settings->_allProfiles.Size());
|
||||
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(0).Source().empty());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(1).Source().empty());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(2).Source().empty());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(3).Source().empty());
|
||||
VERIFY_ARE_EQUAL(L"Windows.Terminal.PowershellCore", settings->_allProfiles.GetAt(0).Source());
|
||||
VERIFY_ARE_EQUAL(L"Windows.Terminal.Wsl", settings->_allProfiles.GetAt(1).Source());
|
||||
VERIFY_ARE_EQUAL(L"Windows.Terminal.Wsl", settings->_allProfiles.GetAt(2).Source());
|
||||
VERIFY_ARE_EQUAL(L"Windows.Terminal.Azure", settings->_allProfiles.GetAt(3).Source());
|
||||
VERIFY_ARE_EQUAL(L"profile0", settings->_allProfiles.GetAt(0).Name());
|
||||
VERIFY_ARE_EQUAL(L"profile1", settings->_allProfiles.GetAt(1).Name());
|
||||
VERIFY_ARE_EQUAL(L"profile2", settings->_allProfiles.GetAt(2).Name());
|
||||
VERIFY_ARE_EQUAL(L"profile3", settings->_allProfiles.GetAt(3).Name());
|
||||
|
||||
settings->LayerJson(settings->_userSettings);
|
||||
VERIFY_ARE_EQUAL(5u, settings->_allProfiles.Size());
|
||||
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(0).Source().empty());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(1).Source().empty());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(2).Source().empty());
|
||||
VERIFY_IS_FALSE(settings->_allProfiles.GetAt(3).Source().empty());
|
||||
VERIFY_IS_TRUE(settings->_allProfiles.GetAt(4).Source().empty());
|
||||
VERIFY_ARE_EQUAL(L"Windows.Terminal.PowershellCore", settings->_allProfiles.GetAt(0).Source());
|
||||
VERIFY_ARE_EQUAL(L"Windows.Terminal.Wsl", settings->_allProfiles.GetAt(1).Source());
|
||||
VERIFY_ARE_EQUAL(L"Windows.Terminal.Wsl", settings->_allProfiles.GetAt(2).Source());
|
||||
VERIFY_ARE_EQUAL(L"Windows.Terminal.Azure", settings->_allProfiles.GetAt(3).Source());
|
||||
// settings->_allProfiles.GetAt(4) does not have a source
|
||||
VERIFY_ARE_EQUAL(L"profile0FromUserSettings", settings->_allProfiles.GetAt(0).Name());
|
||||
VERIFY_ARE_EQUAL(L"profile1FromUserSettings", settings->_allProfiles.GetAt(1).Name());
|
||||
VERIFY_ARE_EQUAL(L"profile2FromUserSettings", settings->_allProfiles.GetAt(2).Name());
|
||||
VERIFY_ARE_EQUAL(L"profile3FromUserSettings", settings->_allProfiles.GetAt(3).Name());
|
||||
VERIFY_ARE_EQUAL(L"profile4FromUserSettings", settings->_allProfiles.GetAt(4).Name());
|
||||
}
|
||||
|
||||
void DynamicProfileTests::UserProfilesWithInvalidSourcesAreIgnored()
|
||||
{
|
||||
winrt::guid guid0 = Microsoft::Console::Utils::GuidFromString(L"{6239a42c-1111-49a3-80bd-e8fdd045185c}");
|
||||
winrt::guid guid1 = Microsoft::Console::Utils::GuidFromString(L"{6239a42c-2222-49a3-80bd-e8fdd045185c}");
|
||||
|
||||
const std::string settings0String{ R"(
|
||||
{
|
||||
"profiles": [
|
||||
{
|
||||
"name" : "profile0FromUserSettings", // this is _allProfiles.at(0)
|
||||
"guid": "{6239a42c-1111-49a3-80bd-e8fdd045185c}",
|
||||
"source": "Terminal.App.UnitTest.0"
|
||||
},
|
||||
{
|
||||
"name" : "profile2", // this shouldn't be in the profiles at all
|
||||
"guid": "{6239a42c-3333-49a3-80bd-e8fdd045185c}",
|
||||
"source": "Terminal.App.UnitTest.1"
|
||||
},
|
||||
{
|
||||
"name" : "profile3", // this is _allProfiles.at(3)
|
||||
"guid": "{6239a42c-4444-49a3-80bd-e8fdd045185c}"
|
||||
}
|
||||
]
|
||||
})" };
|
||||
|
||||
auto gen0 = std::make_unique<TestDynamicProfileGenerator>(L"Terminal.App.UnitTest.0");
|
||||
gen0->pfnGenerate = [guid0, guid1]() {
|
||||
std::vector<Profile> profiles;
|
||||
Profile p0 = winrt::make<implementation::Profile>(guid0);
|
||||
p0.Name(L"profile0"); // this is _allProfiles.at(0)
|
||||
profiles.push_back(p0);
|
||||
return profiles;
|
||||
};
|
||||
auto gen1 = std::make_unique<TestDynamicProfileGenerator>(L"Terminal.App.UnitTest.1");
|
||||
gen1->pfnGenerate = [guid0, guid1]() {
|
||||
std::vector<Profile> profiles;
|
||||
Profile p0 = winrt::make<implementation::Profile>(guid0);
|
||||
Profile p1 = winrt::make<implementation::Profile>(guid1);
|
||||
p0.Name(L"profile0"); // this is _allProfiles.at(1)
|
||||
p1.Name(L"profile1"); // this is _allProfiles.at(2)
|
||||
profiles.push_back(p0);
|
||||
profiles.push_back(p1);
|
||||
return profiles;
|
||||
};
|
||||
|
||||
auto settings = winrt::make_self<implementation::CascadiaSettings>(false);
|
||||
settings->_profileGenerators.emplace_back(std::move(gen0));
|
||||
settings->_profileGenerators.emplace_back(std::move(gen1));
|
||||
|
||||
settings->_ParseJsonString(settings0String, false);
|
||||
VERIFY_ARE_EQUAL(0u, settings->_allProfiles.Size());
|
||||
|
||||
settings->_LoadDynamicProfiles();
|
||||
VERIFY_ARE_EQUAL(3u, settings->_allProfiles.Size());
|
||||
|
||||
settings->LayerJson(settings->_userSettings);
|
||||
VERIFY_ARE_EQUAL(4u, settings->_allProfiles.Size());
|
||||
}
|
||||
|
||||
void DynamicProfileTests::UserProfilesFromDisabledSourcesDontAppear()
|
||||
{
|
||||
winrt::guid guid0 = Microsoft::Console::Utils::GuidFromString(L"{6239a42c-1111-49a3-80bd-e8fdd045185c}");
|
||||
winrt::guid guid1 = Microsoft::Console::Utils::GuidFromString(L"{6239a42c-2222-49a3-80bd-e8fdd045185c}");
|
||||
|
||||
const std::string settings0String{ R"(
|
||||
{
|
||||
"disabledProfileSources": ["Terminal.App.UnitTest.1"],
|
||||
"profiles": [
|
||||
{
|
||||
"name" : "profile0FromUserSettings", // this is _allProfiles.at(0)
|
||||
"guid": "{6239a42c-1111-49a3-80bd-e8fdd045185c}",
|
||||
"source": "Terminal.App.UnitTest.0"
|
||||
},
|
||||
{
|
||||
"name" : "profile1FromUserSettings", // this shouldn't be in the profiles at all
|
||||
"guid": "{6239a42c-2222-49a3-80bd-e8fdd045185c}",
|
||||
"source": "Terminal.App.UnitTest.1"
|
||||
},
|
||||
{
|
||||
"name" : "profile3", // this is _allProfiles.at(1)
|
||||
"guid": "{6239a42c-4444-49a3-80bd-e8fdd045185c}"
|
||||
}
|
||||
]
|
||||
})" };
|
||||
|
||||
auto gen0 = std::make_unique<TestDynamicProfileGenerator>(L"Terminal.App.UnitTest.0");
|
||||
gen0->pfnGenerate = [guid0, guid1]() {
|
||||
std::vector<Profile> profiles;
|
||||
Profile p0 = winrt::make<implementation::Profile>(guid0);
|
||||
p0.Name(L"profile0"); // this is _allProfiles.at(0)
|
||||
profiles.push_back(p0);
|
||||
return profiles;
|
||||
};
|
||||
auto gen1 = std::make_unique<TestDynamicProfileGenerator>(L"Terminal.App.UnitTest.1");
|
||||
gen1->pfnGenerate = [guid0, guid1]() {
|
||||
std::vector<Profile> profiles;
|
||||
Profile p0 = winrt::make<implementation::Profile>(guid0);
|
||||
Profile p1 = winrt::make<implementation::Profile>(guid1);
|
||||
p0.Name(L"profile0"); // this shouldn't be in the profiles at all
|
||||
p1.Name(L"profile1"); // this shouldn't be in the profiles at all
|
||||
profiles.push_back(p0);
|
||||
profiles.push_back(p1);
|
||||
return profiles;
|
||||
};
|
||||
|
||||
auto settings = winrt::make_self<implementation::CascadiaSettings>(false);
|
||||
settings->_profileGenerators.emplace_back(std::move(gen0));
|
||||
settings->_profileGenerators.emplace_back(std::move(gen1));
|
||||
|
||||
settings->_ParseJsonString(settings0String, false);
|
||||
VERIFY_ARE_EQUAL(0u, settings->_allProfiles.Size());
|
||||
|
||||
settings->_LoadDynamicProfiles();
|
||||
VERIFY_ARE_EQUAL(1u, settings->_allProfiles.Size());
|
||||
|
||||
settings->LayerJson(settings->_userSettings);
|
||||
VERIFY_ARE_EQUAL(2u, settings->_allProfiles.Size());
|
||||
}
|
||||
|
||||
};
|
|
@ -1,174 +0,0 @@
|
|||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
#include "precomp.h"
|
||||
|
||||
#include "../TerminalSettingsModel/ColorScheme.h"
|
||||
#include "../TerminalSettingsModel/Profile.h"
|
||||
#include "../TerminalSettingsModel/CascadiaSettings.h"
|
||||
#include "../LocalTests_SettingsModel/JsonTestClass.h"
|
||||
#include "../types/inc/colorTable.hpp"
|
||||
|
||||
using namespace Microsoft::Console;
|
||||
using namespace WEX::Logging;
|
||||
using namespace WEX::TestExecution;
|
||||
using namespace WEX::Common;
|
||||
using namespace winrt::Microsoft::Terminal::Settings::Model;
|
||||
using namespace winrt::Microsoft::Terminal::Control;
|
||||
|
||||
namespace TerminalAppUnitTests
|
||||
{
|
||||
class JsonTests : public JsonTestClass
|
||||
{
|
||||
BEGIN_TEST_CLASS(JsonTests)
|
||||
TEST_CLASS_PROPERTY(L"ActivationContext", L"TerminalApp.Unit.Tests.manifest")
|
||||
END_TEST_CLASS()
|
||||
|
||||
TEST_METHOD(ParseInvalidJson);
|
||||
TEST_METHOD(ParseSimpleColorScheme);
|
||||
TEST_METHOD(ProfileGeneratesGuid);
|
||||
|
||||
TEST_CLASS_SETUP(ClassSetup)
|
||||
{
|
||||
// Use 4 spaces to indent instead of \t
|
||||
_builder.settings_["indentation"] = " ";
|
||||
return true;
|
||||
}
|
||||
|
||||
Json::Value VerifyParseSucceeded(std::string_view content);
|
||||
void VerifyParseFailed(std::string_view content);
|
||||
|
||||
private:
|
||||
Json::StreamWriterBuilder _builder;
|
||||
};
|
||||
|
||||
Json::Value JsonTests::VerifyParseSucceeded(std::string_view content)
|
||||
{
|
||||
Json::Value root;
|
||||
std::string errs;
|
||||
const bool parseResult = _reader->parse(content.data(), content.data() + content.size(), &root, &errs);
|
||||
VERIFY_IS_TRUE(parseResult, winrt::to_hstring(errs).c_str());
|
||||
return root;
|
||||
}
|
||||
|
||||
void JsonTests::VerifyParseFailed(std::string_view content)
|
||||
{
|
||||
Json::Value root;
|
||||
std::string errs;
|
||||
const bool parseResult = _reader->parse(content.data(), content.data() + content.size(), &root, &errs);
|
||||
VERIFY_IS_FALSE(parseResult);
|
||||
}
|
||||
|
||||
void JsonTests::ParseInvalidJson()
|
||||
{
|
||||
const std::string badJson{ "{ foo : bar : baz }" };
|
||||
VerifyParseFailed(badJson);
|
||||
}
|
||||
|
||||
void JsonTests::ParseSimpleColorScheme()
|
||||
{
|
||||
const std::string campbellScheme{ "{"
|
||||
"\"background\" : \"#0C0C0C\","
|
||||
"\"black\" : \"#0C0C0C\","
|
||||
"\"blue\" : \"#0037DA\","
|
||||
"\"brightBlack\" : \"#767676\","
|
||||
"\"brightBlue\" : \"#3B78FF\","
|
||||
"\"brightCyan\" : \"#61D6D6\","
|
||||
"\"brightGreen\" : \"#16C60C\","
|
||||
"\"brightPurple\" : \"#B4009E\","
|
||||
"\"brightRed\" : \"#E74856\","
|
||||
"\"brightWhite\" : \"#F2F2F2\","
|
||||
"\"brightYellow\" : \"#F9F1A5\","
|
||||
"\"cursorColor\" : \"#FFFFFF\","
|
||||
"\"cyan\" : \"#3A96DD\","
|
||||
"\"foreground\" : \"#F2F2F2\","
|
||||
"\"green\" : \"#13A10E\","
|
||||
"\"name\" : \"Campbell\","
|
||||
"\"purple\" : \"#881798\","
|
||||
"\"red\" : \"#C50F1F\","
|
||||
"\"selectionBackground\" : \"#131313\","
|
||||
"\"white\" : \"#CCCCCC\","
|
||||
"\"yellow\" : \"#C19C00\""
|
||||
"}" };
|
||||
|
||||
const auto schemeObject = VerifyParseSucceeded(campbellScheme);
|
||||
auto scheme = implementation::ColorScheme::FromJson(schemeObject);
|
||||
VERIFY_ARE_EQUAL(L"Campbell", scheme->Name());
|
||||
VERIFY_ARE_EQUAL(til::color(0xf2, 0xf2, 0xf2, 255), til::color{ scheme->Foreground() });
|
||||
VERIFY_ARE_EQUAL(til::color(0x0c, 0x0c, 0x0c, 255), til::color{ scheme->Background() });
|
||||
VERIFY_ARE_EQUAL(til::color(0x13, 0x13, 0x13, 255), til::color{ scheme->SelectionBackground() });
|
||||
VERIFY_ARE_EQUAL(til::color(0xFF, 0xFF, 0xFF, 255), til::color{ scheme->CursorColor() });
|
||||
|
||||
std::array<COLORREF, COLOR_TABLE_SIZE> expectedCampbellTable;
|
||||
auto campbellSpan = gsl::span<COLORREF>(&expectedCampbellTable[0], COLOR_TABLE_SIZE);
|
||||
Utils::InitializeCampbellColorTable(campbellSpan);
|
||||
Utils::SetColorTableAlpha(campbellSpan, 0);
|
||||
|
||||
for (size_t i = 0; i < expectedCampbellTable.size(); i++)
|
||||
{
|
||||
const auto& expected = expectedCampbellTable.at(i);
|
||||
const til::color actual{ scheme->Table().at(static_cast<uint32_t>(i)) };
|
||||
VERIFY_ARE_EQUAL(expected, actual);
|
||||
}
|
||||
|
||||
Log::Comment(L"Roundtrip Test for Color Scheme");
|
||||
Json::Value outJson{ scheme->ToJson() };
|
||||
VERIFY_ARE_EQUAL(schemeObject, outJson);
|
||||
}
|
||||
|
||||
void JsonTests::ProfileGeneratesGuid()
|
||||
{
|
||||
// Parse some profiles without guids. We should NOT generate new guids
|
||||
// for them. If a profile doesn't have a GUID, we'll leave its _guid
|
||||
// set to nullopt. The Profile::Guid() getter will
|
||||
// ensure all profiles have a GUID that's actually set.
|
||||
// The null guid _is_ a valid guid, so we won't re-generate that
|
||||
// guid. null is _not_ a valid guid, so we'll leave that nullopt
|
||||
|
||||
// See SettingsTests::ValidateProfilesGenerateGuids for a version of
|
||||
// this test that includes synthesizing GUIDS for profiles without GUIDs
|
||||
// set
|
||||
|
||||
const std::string profileWithoutGuid{ R"({
|
||||
"name" : "profile0"
|
||||
})" };
|
||||
const std::string secondProfileWithoutGuid{ R"({
|
||||
"name" : "profile1"
|
||||
})" };
|
||||
const std::string profileWithNullForGuid{ R"({
|
||||
"name" : "profile2",
|
||||
"guid" : null
|
||||
})" };
|
||||
const std::string profileWithNullGuid{ R"({
|
||||
"name" : "profile3",
|
||||
"guid" : "{00000000-0000-0000-0000-000000000000}"
|
||||
})" };
|
||||
const std::string profileWithGuid{ R"({
|
||||
"name" : "profile4",
|
||||
"guid" : "{6239a42c-1de4-49a3-80bd-e8fdd045185c}"
|
||||
})" };
|
||||
|
||||
const auto profile0Json = VerifyParseSucceeded(profileWithoutGuid);
|
||||
const auto profile1Json = VerifyParseSucceeded(secondProfileWithoutGuid);
|
||||
const auto profile2Json = VerifyParseSucceeded(profileWithNullForGuid);
|
||||
const auto profile3Json = VerifyParseSucceeded(profileWithNullGuid);
|
||||
const auto profile4Json = VerifyParseSucceeded(profileWithGuid);
|
||||
|
||||
const auto profile0 = implementation::Profile::FromJson(profile0Json);
|
||||
const auto profile1 = implementation::Profile::FromJson(profile1Json);
|
||||
const auto profile2 = implementation::Profile::FromJson(profile2Json);
|
||||
const auto profile3 = implementation::Profile::FromJson(profile3Json);
|
||||
const auto profile4 = implementation::Profile::FromJson(profile4Json);
|
||||
const winrt::guid cmdGuid = Utils::GuidFromString(L"{6239a42c-1de4-49a3-80bd-e8fdd045185c}");
|
||||
const winrt::guid nullGuid{};
|
||||
|
||||
VERIFY_IS_FALSE(profile0->HasGuid());
|
||||
VERIFY_IS_FALSE(profile1->HasGuid());
|
||||
VERIFY_IS_FALSE(profile2->HasGuid());
|
||||
VERIFY_IS_TRUE(profile3->HasGuid());
|
||||
VERIFY_IS_TRUE(profile4->HasGuid());
|
||||
|
||||
VERIFY_ARE_EQUAL(profile3->Guid(), nullGuid);
|
||||
VERIFY_ARE_EQUAL(profile4->Guid(), cmdGuid);
|
||||
}
|
||||
}
|
|
@ -29,9 +29,9 @@
|
|||
<!-- ========================= Cpp Files ======================== -->
|
||||
<ItemGroup>
|
||||
<ClCompile Include="ColorHelperTests.cpp" />
|
||||
<ClCompile Include="JsonTests.cpp" />
|
||||
|
||||
<ClCompile Include="JsonUtilsTests.cpp" />
|
||||
<ClCompile Include="DynamicProfileTests.cpp" />
|
||||
|
||||
<ClCompile Include="precomp.cpp">
|
||||
<PrecompiledHeader>Create</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
|
|
|
@ -9,35 +9,17 @@ param (
|
|||
[string]$OutPath,
|
||||
|
||||
[parameter(Mandatory = $true)]
|
||||
[string]$VariableName,
|
||||
|
||||
[switch]$Compress = $false
|
||||
[string]$VariableName
|
||||
)
|
||||
|
||||
$PSDefaultParameterValues['Out-File:NoNewline'] = $true
|
||||
|
||||
$fullPath = Resolve-Path $JsonFile
|
||||
$jsonData = Get-Content -Raw $JsonFile | ConvertFrom-Json | ConvertTo-Json -Compress -Depth 100
|
||||
|
||||
|
||||
$out =
|
||||
"// Copyright (c) Microsoft Corporation`n" +
|
||||
"// Licensed under the MIT license.`n" +
|
||||
"`n" +
|
||||
"// THIS IS AN AUTO-GENERATED FILE`n" +
|
||||
"// Generated from $($fullPath.Path)`n" +
|
||||
"constexpr std::string_view $VariableName{"
|
||||
|
||||
if ($Compress) {
|
||||
$out += "R`"#("
|
||||
$out += Get-Content -Raw $JsonFile | ConvertFrom-Json | ConvertTo-Json -Compress -Depth 100
|
||||
$out += ")#`""
|
||||
} else {
|
||||
$out += "`n"
|
||||
Get-Content $JsonFile | ForEach-Object {
|
||||
$out += "R`"#($_)#`" `"\n`"`n"
|
||||
}
|
||||
}
|
||||
|
||||
$out += "};`n"
|
||||
|
||||
Set-Content -Path $OutPath -Value $out -Encoding utf8 -NoNewline
|
||||
@(
|
||||
"// Copyright (c) Microsoft Corporation",
|
||||
"// Licensed under the MIT license.",
|
||||
"",
|
||||
"// THIS IS AN AUTO-GENERATED FILE",
|
||||
"// Generated from $($fullPath.Path)",
|
||||
"constexpr std::string_view $VariableName{ R`"#($jsonData)#`" };"
|
||||
) | Out-File -FilePath $OutPath -Encoding utf8
|
||||
|
|
Loading…
Reference in a new issue