diff --git a/doc/specs/#1043 - Set the initial position of the Terminal/spec.md b/doc/specs/#1043 - Set the initial position of the Terminal/spec.md index a6dcc7fd7b6..9d7966a491d 100644 --- a/doc/specs/#1043 - Set the initial position of the Terminal/spec.md +++ b/doc/specs/#1043 - Set the initial position of the Terminal/spec.md @@ -27,6 +27,7 @@ Two new properties should be added in the json settings file: 2. Both X value and Y values are optional. If any one of them is missing, or the value is invalid, system default value will be used. Examples: + "1000" equals (1000, 1000) ", 1000" equals (default, 1000) "1000, " equals (1000, default) "," equals (default, default) diff --git a/src/cascadia/LocalTests_TerminalApp/SettingsTests.cpp b/src/cascadia/LocalTests_TerminalApp/SettingsTests.cpp index 67b6a174666..dfc1c8afb91 100644 --- a/src/cascadia/LocalTests_TerminalApp/SettingsTests.cpp +++ b/src/cascadia/LocalTests_TerminalApp/SettingsTests.cpp @@ -1619,4 +1619,4 @@ namespace TerminalAppLocalTests } } -} +} diff --git a/src/cascadia/TerminalSettingsModel/ModelSerializationHelpers.h b/src/cascadia/TerminalSettingsModel/ModelSerializationHelpers.h index d8c9201f662..6531d839e76 100644 --- a/src/cascadia/TerminalSettingsModel/ModelSerializationHelpers.h +++ b/src/cascadia/TerminalSettingsModel/ModelSerializationHelpers.h @@ -16,10 +16,10 @@ Module Name: // - Helper for converting a pair of comma separated, potentially absent integer values // into the corresponding left and right values. The leftValue and rightValue functions // will be called back with the associated parsed integer value, assuming it's present. -// (100, 100): leftValue and rightValue functions both called back with 100. +// (100, 100), (100): leftValue and rightValue functions both called back with 100. // (100, ), (100, abc): leftValue function called back with 100 // (, 100), (abc, 100): rightValue function called back with 100 -// (,): no function called back +// (,), (abc): no function called back // (100, 100, 100): we only read the first two values, this is equivalent to (100, 100) // Arguments: // - string: The string to parse @@ -45,6 +45,7 @@ _TIL_INLINEPREFIX void ParseCommaSeparatedPair(const std::string& string, if (index == 0) { leftValue(value); + if (string.find(',') == std::string::npos) {rightValue(value);} } if (index == 1) diff --git a/src/cascadia/UnitTests_SettingsModel/TerminalSettingsTests.cpp b/src/cascadia/UnitTests_SettingsModel/TerminalSettingsTests.cpp index 36dfd21eae6..90aba8669d8 100644 --- a/src/cascadia/UnitTests_SettingsModel/TerminalSettingsTests.cpp +++ b/src/cascadia/UnitTests_SettingsModel/TerminalSettingsTests.cpp @@ -7,6 +7,7 @@ #include #include "../TerminalSettingsModel/CascadiaSettings.h" +#include "../TerminalSettingsModel/ModelSerializationHelpers.h" #include "TestUtils.h" using namespace Microsoft::Console; @@ -52,6 +53,7 @@ namespace SettingsModelUnitTests TEST_METHOD(MakeSettingsForDefaultProfileThatDoesntExist); TEST_METHOD(TestLayerProfileOnColorScheme); TEST_METHOD(TestCommandlineToTitlePromotion); + TEST_METHOD(TestInitialPositionParsing); }; // CascadiaSettings::_normalizeCommandLine abuses some aspects from CommandLineToArgvW @@ -891,4 +893,49 @@ namespace SettingsModelUnitTests VERIFY_ARE_EQUAL(L"", settingsStruct.DefaultSettings()->StartingTitle()); } } + void TerminalSettingsTests::TestInitialPositionParsing() + { + { + const auto pos = LaunchPositionFromString("50"); + VERIFY_IS_TRUE(pos.X.Value()); + VERIFY_IS_TRUE(pos.Y.Value()); + VERIFY_ARE_EQUAL(50, static_cast(pos.X.Value())); + VERIFY_ARE_EQUAL(50, static_cast(pos.Y.Value())); + } + + { + const auto pos = LaunchPositionFromString("100,"); + VERIFY_IS_TRUE(pos.X.Value()); + VERIFY_ARE_EQUAL(100, static_cast(pos.X.Value())); + VERIFY_IS_TRUE(pos.Y == nullptr); + } + + { + const auto pos = LaunchPositionFromString(",100"); + VERIFY_IS_TRUE(pos.X == nullptr); + VERIFY_IS_TRUE(pos.Y.Value()); + VERIFY_ARE_EQUAL(100, static_cast(pos.Y.Value())); + } + + { + const auto pos = LaunchPositionFromString("50,50"); + VERIFY_IS_TRUE(pos.X.Value()); + VERIFY_ARE_EQUAL(50, static_cast(pos.X.Value())); + VERIFY_IS_TRUE(pos.Y.Value()); + VERIFY_ARE_EQUAL(50, static_cast(pos.Y.Value())); + } + + { + const auto pos = LaunchPositionFromString("abc,100"); + VERIFY_IS_TRUE(pos.X == nullptr); + VERIFY_IS_TRUE(pos.Y.Value()); + VERIFY_ARE_EQUAL(100, static_cast(pos.Y.Value())); + } + + { + const auto pos = LaunchPositionFromString("abc"); + VERIFY_IS_TRUE(pos.X == nullptr); + VERIFY_IS_TRUE(pos.Y == nullptr); + } + } }