Skip to content

NDesk.Options - spike for better command line argument handling #572

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 23 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
3a2ba14
Add NDesk.Options, spike for #428
serra Aug 14, 2015
fb7f54d
Remove most compilation warnings, for #428
serra Aug 14, 2015
7f3bb32
Project now compiles, for #428
serra Aug 14, 2015
5cd297a
Implement -h, for #428
serra Aug 14, 2015
fc45fda
Add several parsing examples, for #428
serra Aug 15, 2015
42a8256
Add output type validation, for #428
serra Aug 15, 2015
f481c1d
update assemblyinfo switch option, for #428
serra Aug 15, 2015
b1970b8
Add nofetch and dynamic repo location options, for #428
serra Aug 15, 2015
2f35fab
Refactoring of special cases, for #428
serra Aug 15, 2015
5b0248d
Add case insensitive option set, for #428
serra Aug 15, 2015
e1e8498
Add target path option with test, for #428
serra Aug 15, 2015
0feebe6
Add commit id option
serra Aug 15, 2015
b189ef9
Add deprecation warning for assembly version info format, for #428
serra Aug 15, 2015
d188db9
Show config option, for #428
serra Aug 15, 2015
2894d9a
Cleanup and some comments, for #428
serra Aug 15, 2015
675f04d
Add init test, for #428
serra Aug 15, 2015
901145d
Update help writer, for #428
serra Aug 16, 2015
99c844a
This is what the updateassemblyinfo should be like, for #428
serra Aug 16, 2015
c2c1917
Update help writer, for #428
serra Aug 16, 2015
18e8f7c
Merge remote-tracking branch 'gittools/master' into 428_NDesk_Spike
serra Aug 16, 2015
6e1db37
Merge remote-tracking branch 'gittools/master' into 428_NDesk_Spike
serra Aug 16, 2015
0a3bc68
Add deprecated parameter, for #428
serra Aug 19, 2015
3d796ad
Last commit for NDesk.Options spike, for #428
serra Aug 21, 2015
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
156 changes: 131 additions & 25 deletions src/GitVersionExe.Tests/ArgumentParserTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@
[TestFixture]
public class ArgumentParserTests
{
[Test, Explicit]
public void PrintHelp()
{
HelpWriter.WriteTo(Console.WriteLine);
}

[Test]
public void Empty_means_use_current_directory()
{
Expand All @@ -26,20 +32,30 @@ public void Single_means_use_as_target_directory()
}

[Test]
public void No_path_and_logfile_should_use_current_directory_TargetDirectory()
[TestCase("-l logFilePath")]
[TestCase("--log=logFilePath")]
[TestCase("-l=logFilePath")]
[TestCase("/l logFilePath")]
[TestCase("/log=logFilePath")]
public void No_path_and_logfile_should_use_current_directory_TargetDirectory(string args)
{
var arguments = ArgumentParser.ParseArguments("-l logFilePath");
var arguments = ArgumentParser.ParseArguments(args);
arguments.TargetPath.ShouldBe(Environment.CurrentDirectory);
arguments.LogFilePath.ShouldBe("logFilePath");
arguments.IsHelp.ShouldBe(false);
}

[Test]
public void h_means_IsHelp()
[TestCase("-h")]
[TestCase("--help")]
[TestCase("/h")]
[TestCase("/help")]
[TestCase("/?")]
public void h_means_IsHelp(string helpArg)
{
var arguments = ArgumentParser.ParseArguments("-h");
Assert.IsNull(arguments.TargetPath);
Assert.IsNull(arguments.LogFilePath);
var arguments = ArgumentParser.ParseArguments(helpArg);
arguments.TargetPath.ShouldBe(null);
arguments.LogFilePath.ShouldBe(null);
arguments.IsHelp.ShouldBe(true);
}

Expand All @@ -51,13 +67,17 @@ public void exec()
}

[Test]
public void exec_with_args()
[TestCase("-execArgs")]
[TestCase("-execargs")]
[TestCase("-EXECARGS")]
[TestCase("-ExEcArGs")]
public void exec_with_args(string caseInsensitiveExecArgs)
{
var arguments = ArgumentParser.ParseArguments(new List<string>
{
"-exec",
"rake",
"-execargs",
caseInsensitiveExecArgs,
"clean build"
});
arguments.Exec.ShouldBe("rake");
Expand Down Expand Up @@ -171,8 +191,6 @@ public void Unknown_argument_should_throw()
exception.Message.ShouldBe("Could not parse command line parameter '-x'.");
}

[TestCase("-updateAssemblyInfo true")]
[TestCase("-updateAssemblyInfo 1")]
[TestCase("-updateAssemblyInfo")]
[TestCase("-updateAssemblyInfo -proj foo.sln")]
public void update_assembly_info_true(string command)
Expand All @@ -181,26 +199,28 @@ public void update_assembly_info_true(string command)
arguments.UpdateAssemblyInfo.ShouldBe(true);
}

[TestCase("-updateAssemblyInfo false")]
[TestCase("-updateAssemblyInfo 0")]
[TestCase("-proj foo.sln")] // absent updateAssemblyInfo flag implies false
[TestCase("")]
public void update_assembly_info_false(string command)
{
var arguments = ArgumentParser.ParseArguments(command);
arguments.UpdateAssemblyInfo.ShouldBe(false);
}

[Test]
public void update_assembly_info_with_filename()
[TestCase("-updateAssemblyInfo=CommonAssemblyInfo.cs")]
[TestCase("-updateAssemblyInfo:CommonAssemblyInfo.cs")]
public void update_assembly_info_with_filename(string args)
{
var arguments = ArgumentParser.ParseArguments("-updateAssemblyInfo CommonAssemblyInfo.cs");
var arguments = ArgumentParser.ParseArguments(args);
arguments.UpdateAssemblyInfo.ShouldBe(true);
arguments.UpdateAssemblyInfoFileName.ShouldBe("CommonAssemblyInfo.cs");
}

[Test]
public void update_assembly_info_with_relative_filename()
[TestCase("-updateAssemblyInfo=..\\..\\CommonAssemblyInfo.cs")]
[TestCase("-updateAssemblyInfo:..\\..\\CommonAssemblyInfo.cs")]
public void update_assembly_info_with_relative_filename(string args)
{
var arguments = ArgumentParser.ParseArguments("-updateAssemblyInfo ..\\..\\CommonAssemblyInfo.cs");
var arguments = ArgumentParser.ParseArguments(args);
arguments.UpdateAssemblyInfo.ShouldBe(true);
arguments.UpdateAssemblyInfoFileName.ShouldBe("..\\..\\CommonAssemblyInfo.cs");
}
Expand All @@ -220,25 +240,111 @@ public void can_log_to_console()
}

[Test]
public void nofetch_true_when_defined()
[TestCase("-nofetch")]
[TestCase("-nofetch+")]
public void nofetch_true_when_defined(string args)
{
var arguments = ArgumentParser.ParseArguments("-nofetch");
arguments.NoFetch = true;
var arguments = ArgumentParser.ParseArguments(args);
arguments.NoFetch.ShouldBe(true);
}

[Test]
[TestCase("")]
[TestCase("-nofetch-")]
public void nofetch_false_when_minus_or_notdefined_(string args)
{
var arguments = ArgumentParser.ParseArguments(args);
arguments.NoFetch.ShouldBe(false);
}

[Test]
public void other_arguments_can_be_parsed_before_nofetch()
{
var arguments = ArgumentParser.ParseArguments("targetpath -nofetch ");
arguments.TargetPath = "targetpath";
arguments.NoFetch = true;
arguments.TargetPath.ShouldBe("targetpath");
arguments.NoFetch.ShouldBe(true);
}

[Test]
public void other_arguments_can_be_parsed_after_nofetch()
{
var arguments = ArgumentParser.ParseArguments("-nofetch -proj foo.sln");
arguments.NoFetch = true;
arguments.Proj = "foo.sln";
arguments.NoFetch.ShouldBe(true);
arguments.Proj.ShouldBe("foo.sln");
}

[TestCase("-targetPath c:\\expected\\path")]
[TestCase("c:\\expected\\path -targetPath c:\\foo\\bar")]
// [TestCase("init -targetPath c:\\expected\\path")] // should we init in target path or current directory?
public void can_specify_target_path(string command)
{
var arguments = ArgumentParser.ParseArguments(command);
arguments.TargetPath.ShouldBe("c:\\expected\\path");
}

[TestCase("-c ce123")]
public void can_specify_commitid(string command)
{
var arguments = ArgumentParser.ParseArguments(command);
arguments.CommitId.ShouldBe("ce123");
}

[TestCase("-v SemVer")]
[TestCase("--showvariable SemVer")]
[TestCase("-showvariable SemVer")]
[TestCase("/showvariable SemVer")]
[TestCase("/v SemVer")]
public void can_show_variable(string command)
{
var arguments = ArgumentParser.ParseArguments(command);
arguments.ShowVariable.ShouldBe("SemVer");
}

[TestCase("-v thisVariableDoesNotExist")]
public void show_non_existing_variable_fails(string args)
{
var exception = Should.Throw<WarningException>(() => ArgumentParser.ParseArguments(args));
exception.Message.ShouldStartWith("show variable switch requires a valid version variable");
}

[TestCase("targetDirectoryPath -assemblyversionformat")]
[TestCase("-assemblyversionformat")]
public void assemblyversionformat_should_throw_warning(string args)
{
var exception = Should.Throw<WarningException>(() => ArgumentParser.ParseArguments(args));
exception.Message.ShouldBe("assemblyversionformat switch removed, use AssemblyVersioningScheme configuration value instead");
}

[TestCase("-updateassemblyinfoname")]
public void updateassemblyinfoname_should_throw_warning(string args)
{
var exception = Should.Throw<WarningException>(() => ArgumentParser.ParseArguments(args));
exception.Message.ShouldBe("updateassemblyinfoname deprecated, use --updateassemblyinfo=[assemblyinfo.cs] instead");
}

[Test]
[TestCase("-showconfig")]
[TestCase("--showConfig+")]
public void showconfig_true_when_defined(string args)
{
var arguments = ArgumentParser.ParseArguments(args);
arguments.ShowConfig.ShouldBe(true);
}

[Test]
[TestCase("")]
[TestCase("-showconfig-")]
public void showconfig_false_when_minus_or_notdefined(string args)
{
var arguments = ArgumentParser.ParseArguments(args);
arguments.ShowConfig.ShouldBe(false);
}

[TestCase("init")]
public void can_use_init_as_postional_arg(string args)
{
var arguments = ArgumentParser.ParseArguments(args);
arguments.Init.ShouldBe(true);
}

}
2 changes: 1 addition & 1 deletion src/GitVersionExe.Tests/HelpWriterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

public class HelpWriterTests
{
[Test]
[Test, Ignore("Since all options are documented in the option specification, I prefer not to test documentation of options.")]
public void AllArgsAreInHelp()
{
var lookup = new Dictionary<string, string>
Expand Down
Loading