Skip to content

Commit 7b7ad37

Browse files
committed
修复 GNU 短选项风格,解除部分单元测试的忽略
1 parent c4861b4 commit 7b7ad37

File tree

4 files changed

+23
-9
lines changed

4 files changed

+23
-9
lines changed

src/DotNetCampus.CommandLine/Utils/Parsers/GnuStyleParser.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public CommandLineParsedResult Parse(IReadOnlyList<string> commandLineArguments)
8585
{
8686
shortOptions.AddOption(shortOption);
8787
}
88-
shortLowPriorityOptions[result.Option.ToString()] = result.Value.ToString();
88+
shortLowPriorityOptions[result.Option[0].ToString()] = result.Value.ToString();
8989
continue;
9090
}
9191

@@ -190,12 +190,12 @@ public static GnuArgument Parse(string argument, GnuParsedType lastType)
190190
{
191191
// 带值的短选项。
192192
return new GnuArgument(GnuParsedType.ShortOptionWithValue)
193-
{ Option = new OptionName(argument, new Range(1, i + 1)), Value = spans[(i + 1)..] };
193+
{ Option = new OptionName(argument, new Range(1, 2)), Value = spans[2..] };
194194
}
195195
if (!char.IsLetterOrDigit(spans[i]))
196196
{
197197
// 包含非字母或数字,说明必定是带值的短选项。-o1.txt
198-
return new GnuArgument(GnuParsedType.ShortOptionWithValue) { Option = new OptionName(argument, new Range(1, i + 1)), Value = spans[i..] };
198+
return new GnuArgument(GnuParsedType.ShortOptionWithValue) { Option = new OptionName(argument, new Range(1, 2)), Value = spans[1..] };
199199
}
200200
}
201201
// 多个短选项,或者带值的短选项。

tests/DotNetCampus.CommandLine.Tests/FlexibleCommandLineParserTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ public void ColonSeparator_ValueAssigned()
120120
Assert.AreEqual("test", value);
121121
}
122122

123-
[Ignore("这样写可读性很差,感觉没有人会喜欢这样的风格。暂定不支持此规则。")]
123+
[Ignore("只有 GNU 风格支持。Flexible 包容万象,但包容不下这种偏门功能。")]
124124
[TestMethod("2.4. 短选项支持无分隔符直接跟参数(GNU风格)")]
125125
public void ShortOption_NoSeparator_ValueAssigned()
126126
{

tests/DotNetCampus.CommandLine.Tests/GnuCommandLineParserTests.cs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,25 @@ public void LongOptionWithEquals_StringType_ValueAssigned()
6868
Assert.AreEqual("test", value);
6969
}
7070

71-
[Ignore("这样写可读性很差,感觉没有人会喜欢这样的风格。暂定不支持此规则。")]
72-
[TestMethod("1.4. 短选项无空格,字符串类型,可正常赋值。")]
71+
[TestMethod("1.4.1 短选项无空格,字符串类型,可正常赋值。")]
7372
public void ShortOptionNoSpace_StringType_ValueAssigned()
73+
{
74+
// Arrange
75+
string[] args = ["-vtest.txt"];
76+
string? value = null;
77+
78+
// Act
79+
CommandLine.Parse(args, GNU)
80+
.AddHandler<GNU02_ShortOptions>(o => value = o.Value)
81+
.Run();
82+
83+
// Assert
84+
Assert.AreEqual("test.txt", value);
85+
}
86+
87+
[Ignore("目前先 Parse 后 As 的两个步骤,会使得第 1 步的 Parse 无法区分这种短选项无空格的值。1.4.1 因为带了非字母的符号所以还能勉强区分。除非我们未来在 CommandLine 对象里对同一个短选项存两种值才可能。")]
88+
[TestMethod("1.4.2 短选项无空格,但难以与缩写区分,字符串类型,可正常赋值。")]
89+
public void ShortOptionNoSpace2_StringType_ValueAssigned()
7490
{
7591
// Arrange
7692
string[] args = ["-vtest"];
@@ -382,7 +398,6 @@ public void CaseInsensitive_CorrectOptionParsed()
382398
Assert.AreEqual("value", value);
383399
}
384400

385-
[Ignore("单纯按匹配规则来说,大小写不敏感的确实会把不同大小写的选项匹配上,导致不知会选中哪个值;但处理好此问题需要额外的处理逻辑。个人认为没必要为了这个没人用的场景多写一些没必要的代码,所以暂定不支持此规则。")]
386401
[TestMethod("3.6. 单个选项设置大小写敏感,全局默认不敏感,识别正确。")]
387402
public void SingleOptionCaseSensitive_GlobalInsensitive_CorrectlyParsed()
388403
{

tests/DotNetCampus.CommandLine.Tests/PosixCommandLineParserTests.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,11 @@ public void MultipleShortOptions_AllParsed()
7575
Assert.IsTrue(flag);
7676
}
7777

78-
[Ignore("POSIX风格不支持短选项无空格跟参数的语法")]
7978
[TestMethod("1.4. 短选项无空格跟参数 (不支持) 。")]
8079
public void ShortOptionNoSpace_NotSupported_ThrowsException()
8180
{
8281
// Arrange
83-
string[] args = ["-vtest"];
82+
string[] args = ["-vtest.txt"];
8483

8584
// Act & Assert
8685
Assert.ThrowsException<CommandLineParseException>(() =>

0 commit comments

Comments
 (0)