diff --git a/src/cascadia/LocalTests_TerminalApp/SettingsTests.cpp b/src/cascadia/LocalTests_TerminalApp/SettingsTests.cpp index 21deac0a216..d243f7517a5 100644 --- a/src/cascadia/LocalTests_TerminalApp/SettingsTests.cpp +++ b/src/cascadia/LocalTests_TerminalApp/SettingsTests.cpp @@ -49,6 +49,7 @@ namespace TerminalAppLocalTests TEST_METHOD(TestExplodingNameOnlyProfiles); TEST_METHOD(TestHideAllProfiles); TEST_METHOD(TestInvalidColorSchemeName); + TEST_METHOD(TestHelperFunctions); TEST_METHOD(TestLayerGlobalsOnRoot); @@ -1264,6 +1265,67 @@ namespace TerminalAppLocalTests VERIFY_ARE_EQUAL(L"Campbell", settings._profiles.at(2)._schemeName.value()); } + void SettingsTests::TestHelperFunctions() + { + const std::string settings0String{ R"( + { + "defaultProfile" : "{2C4DE342-38B7-51CF-B940-2309A097F518}", + "profiles": [ + { + "name" : "profile0", + "guid": "{6239a42c-5555-49a3-80bd-e8fdd045185c}" + }, + { + "name" : "profile1", + "guid": "{6239a42c-6666-49a3-80bd-e8fdd045185c}" + }, + { + "name" : "Ubuntu", + "guid" : "{2C4DE342-38B7-51CF-B940-2309A097F518}" + }, + { + "name" : "ThisProfileShouldNotCrash" + } + ] + })" }; + + auto name0{ L"profile0" }; + auto name1{ L"profile1" }; + auto name2{ L"Ubuntu" }; + auto badName{ L"DoesNotExist" }; + + auto guid0{ Microsoft::Console::Utils::GuidFromString(L"{6239a42c-5555-49a3-80bd-e8fdd045185c}") }; + auto guid1{ Microsoft::Console::Utils::GuidFromString(L"{6239a42c-6666-49a3-80bd-e8fdd045185c}") }; + auto guid2{ Microsoft::Console::Utils::GuidFromString(L"{2C4DE342-38B7-51CF-B940-2309A097F518}") }; + std::optional badGuid{}; + + VerifyParseSucceeded(settings0String); + + CascadiaSettings settings; + settings._ParseJsonString(settings0String, false); + settings.LayerJson(settings._userSettings); + + VERIFY_ARE_EQUAL(guid0, settings.FindGuid(name0)); + VERIFY_ARE_EQUAL(guid1, settings.FindGuid(name1)); + VERIFY_ARE_EQUAL(guid2, settings.FindGuid(name2)); + VERIFY_ARE_EQUAL(badGuid, settings.FindGuid(badName)); + // Following test will fail because GetGuid throws (despite being noexcept) + // VERIFY_ARE_EQUAL(badGuid, settings.FindGuid(L"ThisProfileShouldNotCrash")); + + // Following lines only work because the GUID-less profile is last + auto prof0{ settings.FindProfile(guid0) }; + auto prof1{ settings.FindProfile(guid1) }; + auto prof2{ settings.FindProfile(guid2) }; + // Following line will fail because GetGuid throws (despite being noexcept) + // auto badProf{ settings.FindProfile(badGuid) }; + + VERIFY_ARE_EQUAL(name0, prof0->GetName()); + VERIFY_ARE_EQUAL(name1, prof1->GetName()); + VERIFY_ARE_EQUAL(name2, prof2->GetName()); + // Following test will fail because GetGuid throws (despite being noexcept) + // VERIFY_ARE_EQUAL(badName, badProf->GetName()); + } + void SettingsTests::TestLayerGlobalsOnRoot() { // Test for microsoft/terminal#2906. We added the ability for the root diff --git a/src/cascadia/TerminalApp/CascadiaSettings.cpp b/src/cascadia/TerminalApp/CascadiaSettings.cpp index ff861ab3e2b..a8058267c53 100644 --- a/src/cascadia/TerminalApp/CascadiaSettings.cpp +++ b/src/cascadia/TerminalApp/CascadiaSettings.cpp @@ -63,6 +63,29 @@ CascadiaSettings::CascadiaSettings(const bool addDynamicProfiles) } } +// Method Description: +// - Finds a GUID associated with the given profile name. If no profile matches +// the profile name, returns a std::nullopt. +// Arguments: +// - profileName: the name of the profile's GUID to return. +// Return Value: +// - the GUID associated with the profile name. +std::optional CascadiaSettings::FindGuid(const std::wstring& profileName) const noexcept +{ + std::optional profileGuid{}; + + for (const auto& profile : _profiles) + { + if (profileName == profile.GetName()) + { + profileGuid = profile.GetGuid(); + break; + } + } + + return profileGuid; +} + // Method Description: // - Finds a profile that matches the given GUID. If there is no profile in this // settings object that matches, returns nullptr. diff --git a/src/cascadia/TerminalApp/CascadiaSettings.h b/src/cascadia/TerminalApp/CascadiaSettings.h index a22a6df64e7..31cc4948f79 100644 --- a/src/cascadia/TerminalApp/CascadiaSettings.h +++ b/src/cascadia/TerminalApp/CascadiaSettings.h @@ -65,6 +65,7 @@ class TerminalApp::CascadiaSettings final static std::wstring GetSettingsPath(const bool useRoamingPath = false); static std::wstring GetDefaultSettingsPath(); + std::optional FindGuid(const std::wstring& profileName) const noexcept; const Profile* FindProfile(GUID profileGuid) const noexcept; std::vector& GetWarnings();