Skip to content

Commit 93d6cf3

Browse files
committed
help command is no longer supported if an app has only one command
1 parent 38c81ed commit 93d6cf3

File tree

6 files changed

+194
-15
lines changed

6 files changed

+194
-15
lines changed

ReadMe.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,21 +58,21 @@ public void Hello(
5858
{
5959
```
6060

61-
`help` command(or no argument to pass) shows there detail. This help format is same as `dotnet` command.
61+
`-help` option (or no argument to pass) shows there detail. This help format is same as `dotnet` command.
6262

6363
```
64-
> SampleApp.exe help
64+
> SampleApp.exe -help
6565
Usage: SampleApp [options...]
6666

6767
Options:
6868
-n, -name <String> name of send user. (Required)
6969
-r, -repeat <Int32> repeat count. (Default: 3)
7070
```
7171

72-
`version` command shows `AssemblyInformationalVersion` or `AssemblylVersion`.
72+
`-version` option shows `AssemblyInformationalVersion` or `AssemblylVersion`.
7373

7474
```
75-
> SampleApp.exe version
75+
> SampleApp.exe -version
7676
1.0.0
7777
```
7878

src/ConsoleAppFramework/ConsoleAppEngineHostBuilderExtensions.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -150,26 +150,26 @@ IHostBuilder ConfigureEmptyService()
150150
else
151151
{
152152
// override default Help
153-
args = new string[] { "help" };
153+
args = new string[] { "--help" };
154154
}
155155
}
156156
}
157157

158-
if (!hasHelp && args.Length == 1 && TrimEquals(args[0], HelpCommand))
158+
if (!hasHelp && args.Length == 1 && OptionEquals(args[0], HelpCommand))
159159
{
160160
Console.Write(new CommandHelpBuilder().BuildHelpMessage(methods, defaultMethod));
161161
ConfigureEmptyService();
162162
return hostBuilder;
163163
}
164164

165-
if (args.Length == 1 && TrimEquals(args[0], VersionCommand))
165+
if (args.Length == 1 && OptionEquals(args[0], VersionCommand))
166166
{
167167
ShowVersion();
168168
ConfigureEmptyService();
169169
return hostBuilder;
170170
}
171171

172-
if (args.Length == 2 && methods.Length != 1)
172+
if (args.Length == 2 && methods.Length > 0 && defaultMethod == null)
173173
{
174174
int methodIndex = -1;
175175

@@ -179,7 +179,7 @@ IHostBuilder ConfigureEmptyService()
179179
methodIndex = 1;
180180
}
181181
// command -help
182-
else if (TrimEquals(args[1], HelpCommand))
182+
else if (OptionEquals(args[1], HelpCommand))
183183
{
184184
methodIndex = 0;
185185
}
@@ -223,6 +223,11 @@ static bool TrimEquals(string arg, string command)
223223
return arg.Trim('-').Equals(command, StringComparison.OrdinalIgnoreCase);
224224
}
225225

226+
static bool OptionEquals(string arg, string command)
227+
{
228+
return arg.StartsWith("-") && arg.Trim('-').Equals(command, StringComparison.OrdinalIgnoreCase);
229+
}
230+
226231
static void ShowVersion()
227232
{
228233
var asm = Assembly.GetEntryAssembly();

tests/ConsoleAppFramework.Integration.Test/MultipleCommandTest.cs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,21 +86,86 @@ public void OptionAndArg_Option()
8686
console.Output.Should().Contain("Hello Cysharp (-128)");
8787
}
8888

89+
[Fact]
90+
public void OptionAndArg_Help()
91+
{
92+
using var console = new CaptureConsoleOutput();
93+
var args = new string[] { "hello", "help" };
94+
Host.CreateDefaultBuilder().RunConsoleAppFrameworkAsync<CommandTests_Multiple_OptionAndArg>(args);
95+
console.Output.Should().Contain("Hello help (18)");
96+
}
97+
98+
[Fact]
99+
public void OptionAndArg_HelpAndOtherArgs()
100+
{
101+
using var console = new CaptureConsoleOutput();
102+
var args = new string[] { "hello", "help", "-age", "-128" };
103+
Host.CreateDefaultBuilder().RunConsoleAppFrameworkAsync<CommandTests_Multiple_OptionAndArg>(args);
104+
105+
console.Output.Should().Contain("Hello help (-128)");
106+
}
107+
89108
[Fact]
90109
public void OptionAndArg_HelpOptionLike()
110+
{
111+
using var console = new CaptureConsoleOutput();
112+
var args = new string[] { "hello", "-help" };
113+
Host.CreateDefaultBuilder().RunConsoleAppFrameworkAsync<CommandTests_Multiple_OptionAndArg>(args);
114+
console.Output.Should().Contain("Usage:");
115+
console.Output.Should().Contain("Arguments:");
116+
117+
// NOTE: Currently, ConsoleAppFramework treats the first argument as special. If the argument is '-help', it is same as '-help' option.
118+
//console.Output.Should().Contain("Hello -help (-128)");
119+
}
120+
121+
[Fact]
122+
public void OptionAndArg_HelpOptionLikeAndOtherOptions()
91123
{
92124
using var console = new CaptureConsoleOutput();
93125
var args = new string[] { "hello", "-help", "-age", "-128" };
94126
Host.CreateDefaultBuilder().RunConsoleAppFrameworkAsync<CommandTests_Multiple_OptionAndArg>(args);
127+
95128
console.Output.Should().Contain("Hello -help (-128)");
96129
}
97130

131+
[Fact]
132+
public void CommandHelp_OptionAndArg()
133+
{
134+
using var console = new CaptureConsoleOutput();
135+
var args = new string[] { "help", "hello" };
136+
Host.CreateDefaultBuilder().RunConsoleAppFrameworkAsync<CommandTests_Multiple_OptionAndArg>(args);
137+
console.Output.Should().Contain("Usage:");
138+
console.Output.Should().Contain("Arguments:");
139+
}
140+
98141
public class CommandTests_Multiple_OptionAndArg : ConsoleAppBase
99142
{
100143
[Command("hello")]
101144
public void Hello([Option(0)]string name, int age = 18) => Console.WriteLine($"Hello {name} ({age})");
102145
[Command("konnichiwa")]
103146
public void Konnichiwa() => Console.WriteLine("Konnichiwa");
104147
}
148+
149+
[Fact]
150+
public void OptionHelp()
151+
{
152+
using var console = new CaptureConsoleOutput();
153+
var args = new string[] { "-help" };
154+
Host.CreateDefaultBuilder().RunConsoleAppFrameworkAsync<CommandTests_Multiple_Commands>(args);
155+
console.Output.Should().Contain("Usage:");
156+
console.Output.Should().Contain("Commands:");
157+
console.Output.Should().Contain("hello");
158+
console.Output.Should().Contain("konnichiwa");
159+
}
160+
161+
[Fact]
162+
public void OptionVersion()
163+
{
164+
using var console = new CaptureConsoleOutput();
165+
var args = new string[] { "-version" };
166+
Host.CreateDefaultBuilder().RunConsoleAppFrameworkAsync<CommandTests_Multiple_Commands>(args);
167+
console.Output.Should().MatchRegex(@"\d.\d.\d"); // NOTE: When running with unit test runner, it returns a version of the runner.
168+
}
169+
105170
}
106171
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
using System;
2+
using FluentAssertions;
3+
using Microsoft.Extensions.Hosting;
4+
using Xunit;
5+
6+
// ReSharper disable InconsistentNaming
7+
8+
namespace ConsoleAppFramework.Integration.Test
9+
{
10+
public partial class NamedSingleCommandTest
11+
{
12+
[Fact]
13+
public void NamedCommand_NoArgs_CommandIsNotSpecified()
14+
{
15+
using var console = new CaptureConsoleOutput();
16+
var args = new string[] { };
17+
Host.CreateDefaultBuilder().RunConsoleAppFrameworkAsync<CommandTests_Single_Named_NoArgs>(args);
18+
console.Output.Should().Contain("Usage:");
19+
console.Output.Should().Contain("Commands:");
20+
}
21+
22+
[Fact]
23+
public void NamedCommand_NoArgs_Invoke()
24+
{
25+
using var console = new CaptureConsoleOutput();
26+
var args = new string[] { "hello" };
27+
Host.CreateDefaultBuilder().RunConsoleAppFrameworkAsync<CommandTests_Single_Named_NoArgs>(args);
28+
console.Output.Should().Contain("Hello");
29+
}
30+
31+
[Fact]
32+
public void NamedCommand_NoArgs_CommandHelp()
33+
{
34+
using var console = new CaptureConsoleOutput();
35+
var args = new string[] { "help", "hello" };
36+
Host.CreateDefaultBuilder().RunConsoleAppFrameworkAsync<CommandTests_Single_Named_NoArgs>(args);
37+
console.Output.Should().Contain("Usage:");
38+
console.Output.Should().Contain(" hello");
39+
}
40+
41+
public class CommandTests_Single_Named_NoArgs : ConsoleAppBase
42+
{
43+
[Command("hello")]
44+
public void Hello() => Console.WriteLine("Hello");
45+
}
46+
47+
[Fact]
48+
public void NamedCommand_OneArg_CommandIsNotSpecified()
49+
{
50+
using var console = new CaptureConsoleOutput();
51+
var args = new string[] { };
52+
Host.CreateDefaultBuilder().RunConsoleAppFrameworkAsync<CommandTests_Single_Named_OneArg>(args);
53+
console.Output.Should().Contain("Usage:");
54+
console.Output.Should().Contain("Commands:");
55+
}
56+
57+
[Fact]
58+
public void NamedCommand_OneArg_Invoke()
59+
{
60+
using var console = new CaptureConsoleOutput();
61+
var args = new string[] { "hello", "Cysharp" };
62+
Host.CreateDefaultBuilder().RunConsoleAppFrameworkAsync<CommandTests_Single_Named_OneArg>(args);
63+
console.Output.Should().Contain("Hello Cysharp");
64+
}
65+
66+
[Fact]
67+
public void NamedCommand_OneArg_CommandHelp()
68+
{
69+
using var console = new CaptureConsoleOutput();
70+
var args = new string[] { "help", "hello" };
71+
Host.CreateDefaultBuilder().RunConsoleAppFrameworkAsync<CommandTests_Single_Named_OneArg>(args);
72+
console.Output.Should().Contain("Usage:");
73+
console.Output.Should().Contain("Arguments:");
74+
}
75+
76+
public class CommandTests_Single_Named_OneArg : ConsoleAppBase
77+
{
78+
[Command("hello")]
79+
public void Hello([Option(0)]string name) => Console.WriteLine($"Hello {name}");
80+
}
81+
82+
}
83+
}

tests/ConsoleAppFramework.Integration.Test/SingleCommandTest.Arguments.cs

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@ public void NoOptions_OneRequiredArg_ArgHelp()
2525
var args = new[] { "help" };
2626
Host.CreateDefaultBuilder().RunConsoleAppFrameworkAsync<CommandTests_Single_NoOptions_OneRequiredArg>(args);
2727
console.Output.Should().Contain("Hello help");
28-
// console.GetOutputText().Should().Contain("Usage:");
29-
// console.GetOutputText().Should().Contain("Arguments:");
3028
}
3129

3230
[Fact]
@@ -47,6 +45,21 @@ public void NoOptions_OneRequiredArg_Help()
4745
Host.CreateDefaultBuilder().RunConsoleAppFrameworkAsync<CommandTests_Single_NoOptions_OneRequiredArg>(args);
4846
console.Output.Should().Contain("Usage:");
4947
console.Output.Should().Contain("Arguments:");
48+
49+
// NOTE: Currently, ConsoleAppFramework treats the first argument as special. If the argument is '-help', it is same as '-help' option.
50+
//console.Output.Should().Contain("Hello -version");
51+
}
52+
53+
[Fact]
54+
public void NoOptions_OneRequiredArg_Version()
55+
{
56+
using var console = new CaptureConsoleOutput();
57+
var args = new[] { "-version" };
58+
Host.CreateDefaultBuilder().RunConsoleAppFrameworkAsync<CommandTests_Single_NoOptions_OneRequiredArg>(args);
59+
console.Output.Should().MatchRegex(@"\d.\d.\d"); // NOTE: When running with unit test runner, it returns a version of the runner.
60+
61+
// NOTE: Currently, ConsoleAppFramework treats the first argument as special. If the argument is '-help', it is same as '-help' option.
62+
//console.Output.Should().Contain("Hello -version");
5063
}
5164

5265
public class CommandTests_Single_NoOptions_OneRequiredArg : ConsoleAppBase
@@ -70,8 +83,6 @@ public void NoOptions_OneOptionalArg_ArgHelp()
7083
var args = new[] { "help" };
7184
Host.CreateDefaultBuilder().RunConsoleAppFrameworkAsync<CommandTests_Single_NoOptions_OneOptionalArgs>(args);
7285
console.Output.Should().Contain("Hello help");
73-
// console.GetOutputText().Should().Contain("Usage:");
74-
// console.GetOutputText().Should().Contain("Arguments:");
7586
}
7687

7788
[Fact]
@@ -91,6 +102,21 @@ public void NoOptions_OneOptionalArg_Help()
91102
Host.CreateDefaultBuilder().RunConsoleAppFrameworkAsync<CommandTests_Single_NoOptions_OneOptionalArgs>(args);
92103
console.Output.Should().Contain("Usage:");
93104
console.Output.Should().Contain("Arguments:");
105+
106+
// NOTE: Currently, ConsoleAppFramework treats the first argument as special. If the argument is '-help', it is same as '-help' option.
107+
//console.Output.Should().Contain("Hello -help");
108+
}
109+
110+
[Fact]
111+
public void NoOptions_OneOptionalArg_Version()
112+
{
113+
using var console = new CaptureConsoleOutput();
114+
var args = new[] { "-version" };
115+
Host.CreateDefaultBuilder().RunConsoleAppFrameworkAsync<CommandTests_Single_NoOptions_OneOptionalArgs>(args);
116+
console.Output.Should().MatchRegex(@"\d.\d.\d"); // NOTE: When running with unit test runner, it returns a version of the runner.
117+
118+
// NOTE: Currently, ConsoleAppFramework treats the first argument as special. If the argument is '-help', it is same as '-help' option.
119+
//console.Output.Should().Contain("Hello -version");
94120
}
95121

96122
public class CommandTests_Single_NoOptions_OneOptionalArgs : ConsoleAppBase

tests/ConsoleAppFramework.Tests/SingleContainedTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ public async Task SimpleComplexArgsTest()
116116
public class TwoArgsWithOption : ConsoleAppBase
117117
{
118118
public void Hello(
119-
[Option("-n", "name of this")]string name,
120-
[Option("-r", "repeat msg")]int repeat)
119+
[Option("n", "name of this")]string name,
120+
[Option("r", "repeat msg")]int repeat)
121121
{
122122
Context.Logger.LogInformation($"name:{name}");
123123
Context.Logger.LogInformation($"repeat:{repeat}");

0 commit comments

Comments
 (0)