Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
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
Next Next commit
introduce IArgumentParser
  • Loading branch information
arturcic committed Oct 18, 2019
commit c5d37c2e47e4ec647a4a14f00b7dc95a7eee7a83
94 changes: 51 additions & 43 deletions src/GitVersionExe.Tests/ArgumentParserTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,18 @@ namespace GitVersionExe.Tests
[TestFixture]
public class ArgumentParserTests
{
private IArgumentParser argumentParser;

[SetUp]
public void SetUp()
{
argumentParser = new ArgumentParser();
}

[Test]
public void Empty_means_use_current_directory()
{
var arguments = ArgumentParser.ParseArguments("");
var arguments = argumentParser.ParseArguments("");
arguments.TargetPath.ShouldBe(Environment.CurrentDirectory);
arguments.LogFilePath.ShouldBe(null);
arguments.IsHelp.ShouldBe(false);
Expand All @@ -24,7 +32,7 @@ public void Empty_means_use_current_directory()
[Test]
public void Single_means_use_as_target_directory()
{
var arguments = ArgumentParser.ParseArguments("path");
var arguments = argumentParser.ParseArguments("path");
arguments.TargetPath.ShouldBe("path");
arguments.LogFilePath.ShouldBe(null);
arguments.IsHelp.ShouldBe(false);
Expand All @@ -33,7 +41,7 @@ public void Single_means_use_as_target_directory()
[Test]
public void No_path_and_logfile_should_use_current_directory_TargetDirectory()
{
var arguments = ArgumentParser.ParseArguments("-l logFilePath");
var arguments = argumentParser.ParseArguments("-l logFilePath");
arguments.TargetPath.ShouldBe(Environment.CurrentDirectory);
arguments.LogFilePath.ShouldBe("logFilePath");
arguments.IsHelp.ShouldBe(false);
Expand All @@ -42,7 +50,7 @@ public void No_path_and_logfile_should_use_current_directory_TargetDirectory()
[Test]
public void H_means_IsHelp()
{
var arguments = ArgumentParser.ParseArguments("-h");
var arguments = argumentParser.ParseArguments("-h");
Assert.IsNull(arguments.TargetPath);
Assert.IsNull(arguments.LogFilePath);
arguments.IsHelp.ShouldBe(true);
Expand All @@ -51,14 +59,14 @@ public void H_means_IsHelp()
[Test]
public void Exec()
{
var arguments = ArgumentParser.ParseArguments("-exec rake");
var arguments = argumentParser.ParseArguments("-exec rake");
arguments.Exec.ShouldBe("rake");
}

[Test]
public void Exec_with_args()
{
var arguments = ArgumentParser.ParseArguments(new List<string>
var arguments = argumentParser.ParseArguments(new List<string>
{
"-exec",
"rake",
Expand All @@ -72,14 +80,14 @@ public void Exec_with_args()
[Test]
public void Msbuild()
{
var arguments = ArgumentParser.ParseArguments("-proj msbuild.proj");
var arguments = argumentParser.ParseArguments("-proj msbuild.proj");
arguments.Proj.ShouldBe("msbuild.proj");
}

[Test]
public void Msbuild_with_args()
{
var arguments = ArgumentParser.ParseArguments(new List<string>
var arguments = argumentParser.ParseArguments(new List<string>
{
"-proj",
"msbuild.proj",
Expand All @@ -93,15 +101,15 @@ public void Msbuild_with_args()
[Test]
public void Execwith_targetdirectory()
{
var arguments = ArgumentParser.ParseArguments("targetDirectoryPath -exec rake");
var arguments = argumentParser.ParseArguments("targetDirectoryPath -exec rake");
arguments.TargetPath.ShouldBe("targetDirectoryPath");
arguments.Exec.ShouldBe("rake");
}

[Test]
public void TargetDirectory_and_LogFilePath_can_be_parsed()
{
var arguments = ArgumentParser.ParseArguments("targetDirectoryPath -l logFilePath");
var arguments = argumentParser.ParseArguments("targetDirectoryPath -l logFilePath");
arguments.TargetPath.ShouldBe("targetDirectoryPath");
arguments.LogFilePath.ShouldBe("logFilePath");
arguments.IsHelp.ShouldBe(false);
Expand All @@ -110,7 +118,7 @@ public void TargetDirectory_and_LogFilePath_can_be_parsed()
[Test]
public void Username_and_Password_can_be_parsed()
{
var arguments = ArgumentParser.ParseArguments("targetDirectoryPath -u [username] -p [password]");
var arguments = argumentParser.ParseArguments("targetDirectoryPath -u [username] -p [password]");
arguments.TargetPath.ShouldBe("targetDirectoryPath");
arguments.Authentication.Username.ShouldBe("[username]");
arguments.Authentication.Password.ShouldBe("[password]");
Expand All @@ -120,42 +128,42 @@ public void Username_and_Password_can_be_parsed()
[Test]
public void Unknown_output_should_throw()
{
var exception = Assert.Throws<WarningException>(() => ArgumentParser.ParseArguments("targetDirectoryPath -output invalid_value"));
var exception = Assert.Throws<WarningException>(() => argumentParser.ParseArguments("targetDirectoryPath -output invalid_value"));
exception.Message.ShouldBe("Value 'invalid_value' cannot be parsed as output type, please use 'json' or 'buildserver'");
}

[Test]
public void Output_defaults_to_json()
{
var arguments = ArgumentParser.ParseArguments("targetDirectoryPath");
var arguments = argumentParser.ParseArguments("targetDirectoryPath");
arguments.Output.ShouldBe(OutputType.Json);
}

[Test]
public void Output_json_can_be_parsed()
{
var arguments = ArgumentParser.ParseArguments("targetDirectoryPath -output json");
var arguments = argumentParser.ParseArguments("targetDirectoryPath -output json");
arguments.Output.ShouldBe(OutputType.Json);
}

[Test]
public void Output_buildserver_can_be_parsed()
{
var arguments = ArgumentParser.ParseArguments("targetDirectoryPath -output buildserver");
var arguments = argumentParser.ParseArguments("targetDirectoryPath -output buildserver");
arguments.Output.ShouldBe(OutputType.BuildServer);
}

[Test]
public void MultipleArgsAndFlag()
{
var arguments = ArgumentParser.ParseArguments("targetDirectoryPath -output buildserver -updateAssemblyInfo");
var arguments = argumentParser.ParseArguments("targetDirectoryPath -output buildserver -updateAssemblyInfo");
arguments.Output.ShouldBe(OutputType.BuildServer);
}

[Test]
public void Url_and_BranchName_can_be_parsed()
{
var arguments = ArgumentParser.ParseArguments("targetDirectoryPath -url http://github.com/Particular/GitVersion.git -b somebranch");
var arguments = argumentParser.ParseArguments("targetDirectoryPath -url http://github.com/Particular/GitVersion.git -b somebranch");
arguments.TargetPath.ShouldBe("targetDirectoryPath");
arguments.TargetUrl.ShouldBe("http://github.com/Particular/GitVersion.git");
arguments.TargetBranch.ShouldBe("somebranch");
Expand All @@ -165,15 +173,15 @@ public void Url_and_BranchName_can_be_parsed()
[Test]
public void Wrong_number_of_arguments_should_throw()
{
var exception = Assert.Throws<WarningException>(() => ArgumentParser.ParseArguments("targetDirectoryPath -l logFilePath extraArg"));
var exception = Assert.Throws<WarningException>(() => argumentParser.ParseArguments("targetDirectoryPath -l logFilePath extraArg"));
exception.Message.ShouldBe("Could not parse command line parameter 'extraArg'.");
}

[TestCase("targetDirectoryPath -x logFilePath")]
[TestCase("/invalid-argument")]
public void Unknown_arguments_should_throw(string arguments)
{
var exception = Assert.Throws<WarningException>(() => ArgumentParser.ParseArguments(arguments));
var exception = Assert.Throws<WarningException>(() => argumentParser.ParseArguments(arguments));
exception.Message.ShouldStartWith("Could not parse command line parameter");
}

Expand All @@ -187,37 +195,37 @@ public void Unknown_arguments_should_throw(string arguments)
[TestCase("-updateAssemblyInfo Assembly.cs Assembly.cs -ensureassemblyinfo")]
public void Update_assembly_info_true(string command)
{
var arguments = ArgumentParser.ParseArguments(command);
var arguments = argumentParser.ParseArguments(command);
arguments.UpdateAssemblyInfo.ShouldBe(true);
}

[TestCase("-updateAssemblyInfo false")]
[TestCase("-updateAssemblyInfo 0")]
public void Update_assembly_info_false(string command)
{
var arguments = ArgumentParser.ParseArguments(command);
var arguments = argumentParser.ParseArguments(command);
arguments.UpdateAssemblyInfo.ShouldBe(false);
}

[TestCase("-updateAssemblyInfo Assembly.cs Assembly1.cs -ensureassemblyinfo")]
public void Create_mulitple_assembly_info_protected(string command)
{
var exception = Assert.Throws<WarningException>(() => ArgumentParser.ParseArguments(command));
var exception = Assert.Throws<WarningException>(() => argumentParser.ParseArguments(command));
exception.Message.ShouldBe("Can't specify multiple assembly info files when using /ensureassemblyinfo switch, either use a single assembly info file or do not specify /ensureassemblyinfo and create assembly info files manually");
}

[Test]
public void Update_assembly_info_with_filename()
{
var arguments = ArgumentParser.ParseArguments("-updateAssemblyInfo CommonAssemblyInfo.cs");
var arguments = argumentParser.ParseArguments("-updateAssemblyInfo CommonAssemblyInfo.cs");
arguments.UpdateAssemblyInfo.ShouldBe(true);
arguments.UpdateAssemblyInfoFileName.ShouldContain("CommonAssemblyInfo.cs");
}

[Test]
public void Update_assembly_info_with_multiple_filenames()
{
var arguments = ArgumentParser.ParseArguments("-updateAssemblyInfo CommonAssemblyInfo.cs VersionAssemblyInfo.cs");
var arguments = argumentParser.ParseArguments("-updateAssemblyInfo CommonAssemblyInfo.cs VersionAssemblyInfo.cs");
arguments.UpdateAssemblyInfo.ShouldBe(true);
arguments.UpdateAssemblyInfoFileName.Count.ShouldBe(2);
arguments.UpdateAssemblyInfoFileName.ShouldContain("CommonAssemblyInfo.cs");
Expand All @@ -227,15 +235,15 @@ public void Update_assembly_info_with_multiple_filenames()
[Test]
public void Overrideconfig_with_no_options()
{
var arguments = ArgumentParser.ParseArguments("/overrideconfig");
var arguments = argumentParser.ParseArguments("/overrideconfig");
arguments.HasOverrideConfig.ShouldBe(false);
arguments.OverrideConfig.ShouldNotBeNull();
}

[Test]
public void Overrideconfig_with_single_tagprefix_option()
{
var arguments = ArgumentParser.ParseArguments("/overrideconfig tag-prefix=sample");
var arguments = argumentParser.ParseArguments("/overrideconfig tag-prefix=sample");
arguments.HasOverrideConfig.ShouldBe(true);
arguments.OverrideConfig.TagPrefix.ShouldBe("sample");
}
Expand All @@ -244,109 +252,109 @@ public void Overrideconfig_with_single_tagprefix_option()
[TestCase("tag-prefix=sample;param2=other")]
public void Overrideconfig_with_several_options(string options)
{
var exception = Assert.Throws<WarningException>(() => ArgumentParser.ParseArguments($"/overrideconfig {options}"));
var exception = Assert.Throws<WarningException>(() => argumentParser.ParseArguments($"/overrideconfig {options}"));
exception.Message.ShouldContain("Can't specify multiple /overrideconfig options");
}

[TestCase("tag-prefix=sample=asdf")]
public void Overrideconfig_with_invalid_option(string options)
{
var exception = Assert.Throws<WarningException>(() => ArgumentParser.ParseArguments($"/overrideconfig {options}"));
var exception = Assert.Throws<WarningException>(() => argumentParser.ParseArguments($"/overrideconfig {options}"));
exception.Message.ShouldContain("Could not parse /overrideconfig option");
}

[Test]
public void Update_assembly_info_with_relative_filename()
{
var arguments = ArgumentParser.ParseArguments("-updateAssemblyInfo ..\\..\\CommonAssemblyInfo.cs");
var arguments = argumentParser.ParseArguments("-updateAssemblyInfo ..\\..\\CommonAssemblyInfo.cs");
arguments.UpdateAssemblyInfo.ShouldBe(true);
arguments.UpdateAssemblyInfoFileName.ShouldContain("..\\..\\CommonAssemblyInfo.cs");
}

[Test]
public void Ensure_assembly_info_true_when_found()
{
var arguments = ArgumentParser.ParseArguments("-ensureAssemblyInfo");
var arguments = argumentParser.ParseArguments("-ensureAssemblyInfo");
arguments.EnsureAssemblyInfo.ShouldBe(true);
}

[Test]
public void Ensure_assembly_info_true()
{
var arguments = ArgumentParser.ParseArguments("-ensureAssemblyInfo true");
var arguments = argumentParser.ParseArguments("-ensureAssemblyInfo true");
arguments.EnsureAssemblyInfo.ShouldBe(true);
}

[Test]
public void Ensure_assembly_info_false()
{
var arguments = ArgumentParser.ParseArguments("-ensureAssemblyInfo false");
var arguments = argumentParser.ParseArguments("-ensureAssemblyInfo false");
arguments.EnsureAssemblyInfo.ShouldBe(false);
}

[Test]
public void DynamicRepoLocation()
{
var arguments = ArgumentParser.ParseArguments("-dynamicRepoLocation c:\\foo\\");
var arguments = argumentParser.ParseArguments("-dynamicRepoLocation c:\\foo\\");
arguments.DynamicRepositoryLocation.ShouldBe("c:\\foo\\");
}

[Test]
public void Can_log_to_console()
{
var arguments = ArgumentParser.ParseArguments("-l console -proj foo.sln");
var arguments = argumentParser.ParseArguments("-l console -proj foo.sln");
arguments.LogFilePath.ShouldBe("console");
}

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

[Test]
public void Nonormilize_true_when_defined()
{
var arguments = ArgumentParser.ParseArguments("-nonormalize");
var arguments = argumentParser.ParseArguments("-nonormalize");
arguments.NoNormalize.ShouldBe(true);
}

[Test]
public void Other_arguments_can_be_parsed_before_nofetch()
{
var arguments = ArgumentParser.ParseArguments("targetpath -nofetch ");
var arguments = argumentParser.ParseArguments("targetpath -nofetch ");
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");
var arguments = argumentParser.ParseArguments("-nofetch -proj foo.sln");
arguments.NoFetch.ShouldBe(true);
arguments.Proj.ShouldBe("foo.sln");
}

[Test]
public void Log_path_can_contain_forward_slash()
{
var arguments = ArgumentParser.ParseArguments("-l /some/path");
var arguments = argumentParser.ParseArguments("-l /some/path");
arguments.LogFilePath.ShouldBe("/some/path");
}

[Test]
public void Boolean_argument_handling()
{
var arguments = ArgumentParser.ParseArguments("/nofetch /updateassemblyinfo true");
var arguments = argumentParser.ParseArguments("/nofetch /updateassemblyinfo true");
arguments.NoFetch.ShouldBe(true);
arguments.UpdateAssemblyInfo.ShouldBe(true);
}

[Test]
public void Nocache_true_when_defined()
{
var arguments = ArgumentParser.ParseArguments("-nocache");
var arguments = argumentParser.ParseArguments("-nocache");
arguments.NoCache.ShouldBe(true);
}

Expand All @@ -361,11 +369,11 @@ public void Check_verbosity_parsing(string command, bool shouldThrow, VerbosityL
{
if (shouldThrow)
{
Assert.Throws<WarningException>(() => ArgumentParser.ParseArguments(command));
Assert.Throws<WarningException>(() => argumentParser.ParseArguments(command));
}
else
{
var arguments = ArgumentParser.ParseArguments(command);
var arguments = argumentParser.ParseArguments(command);
arguments.Verbosity.ShouldBe(expectedVerbosity);
}
}
Expand Down
Loading