using System; using System.IO; using System.Linq; using NUnit.Framework; namespace Antmicro.OptionsParser.Tests { [TestFixture] public class ParserTests { [Test] public void ShouldDetectShortSwitch() { var args = new [] { "-c" }; var parser = new OptionsParser(); parser.WithOption('c'); parser.Parse(args); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual('c', parser.ParsedOptions.First().Flag.ShortName); } [Test] public void ShouldSetShortSwitchInClass() { var args = new [] { "-s" }; var options = new OptionsWithBool(); var parser = new OptionsParser(); parser.Parse(options, args); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual(options.Switch, true); } [Test] public void ShouldDetectLongSwitch() { var args = new [] { "--long" }; var parser = new OptionsParser(); parser.WithOption("long"); parser.Parse(args); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual("long", parser.ParsedOptions.First().Flag.LongName); } [Test] public void ShouldDetectOptionHavingBothShortAndLongName() { var argsShort = new [] { "-l" }; var argsLong = new [] { "--long" }; foreach(var args in new [] { argsShort, argsLong }) { var parser = new OptionsParser(); parser.WithOption('l', "long"); parser.Parse(args); Assert.AreEqual(1, parser.ParsedOptions.Count()); var flag = parser.ParsedOptions.First().Flag; Assert.AreEqual('l', flag.ShortName); Assert.AreEqual("long", flag.LongName); } } [Test] public void ShouldDetectUnexpectedShortSwitch() { var args = new [] { "-xc" }; var parser = new OptionsParser(); parser.WithOption('c'); parser.Parse(args); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual('c', parser.ParsedOptions.First().Flag.ShortName); Assert.AreEqual(1, parser.UnexpectedArguments.Count()); Assert.AreEqual("x", parser.UnexpectedArguments.First().Value); } [Test] public void ShouldDetectUnexpectedLongSwitch() { var args = new [] { "--long", "--secondLong" }; var parser = new OptionsParser(); parser.WithOption("long"); parser.Parse(args); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual("long", parser.ParsedOptions.First().Flag.LongName); Assert.AreEqual(1, parser.UnexpectedArguments.Count()); Assert.AreEqual("secondLong", parser.UnexpectedArguments.First().Value); } [Test] public void ShouldDetectedUnexpectedShortSwitchWithValue() { var args = new [] { "-cx", "value with whitespace" }; var parser = new OptionsParser(); parser.WithOption('c'); parser.Parse(args); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual('c', parser.ParsedOptions.First().Flag.ShortName); Assert.AreEqual(2, parser.UnexpectedArguments.Count()); Assert.AreEqual("x", parser.UnexpectedArguments.ElementAt(0).Value); Assert.AreEqual("value with whitespace", parser.UnexpectedArguments.ElementAt(1).Value); } [Test] public void ShouldParseOptionValueWithHyphen() { var args = new [] { "-c", "value-with-hyphen" }; var parser = new OptionsParser(); parser.WithOption('c'); parser.Parse(args); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual('c', parser.ParsedOptions.First().Flag.ShortName); Assert.AreEqual("value-with-hyphen", parser.ParsedOptions.First().Value); Assert.AreEqual(0, parser.UnexpectedArguments.Count()); } [Test] public void ShouldThrowAnExceptionForShortOptionRequiringValueWhenThereIsNone() { var args = new [] { "-n" }; var parser = new OptionsParser(new ParserConfiguration { ThrowValidationException = true }); parser.WithOption('n'); try { parser.Parse(args); Assert.Fail("Should throw an exception"); } catch (ValidationException e) { Assert.IsTrue(e.Message.Contains("requires parameter of type")); } } [Test] public void ShouldThrowAnExceptionForLongOptionRequiringValueWhenThereIsNone() { var args = new [] { "--long" }; var parser = new OptionsParser(new ParserConfiguration { ThrowValidationException = true }); parser.WithOption("long"); try { parser.Parse(args); Assert.Fail("Should throw an exception"); } catch (ValidationException e) { Assert.IsTrue(e.Message.Contains("requires parameter of type")); } } [Test] public void ShouldParseShortSwitchWithValue() { var args = new [] { "-n123" }; var parser = new OptionsParser(); parser.WithOption('n'); parser.Parse(args); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual('n', parser.ParsedOptions.First().Flag.ShortName); Assert.AreEqual(123, parser.ParsedOptions.First().Value); } [Test] public void ShouldParseLongSwitchWithValue() { var args = new [] { "--number", "123" }; var parser = new OptionsParser(); parser.WithOption("number"); parser.Parse(args); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual("number", parser.ParsedOptions.First().Flag.LongName); Assert.AreEqual(123, parser.ParsedOptions.First().Value); } [Test] public void ShouldParseLongSwitchWithStringWithAssignmentOperator() { var args = new [] { "--long=test" }; var parser = new OptionsParser(); parser.WithOption("long"); parser.Parse(args); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual("long", parser.ParsedOptions.First().Flag.LongName); Assert.AreEqual("test", parser.ParsedOptions.First().Value); } [Test] public void ShouldParseShortSwitchWithStringValue() { var args = new [] { "-nmValue" }; var parser = new OptionsParser(); parser.WithOption('n'); parser.WithOption('m'); parser.Parse(args); Assert.AreEqual(2, parser.ParsedOptions.Count()); Assert.AreEqual('n', parser.ParsedOptions.First().Flag.ShortName); Assert.AreEqual('m', parser.ParsedOptions.Skip(1).First().Flag.ShortName); Assert.AreEqual("Value", parser.ParsedOptions.Skip(1).First().Value); } [Test] public void ShouldParseOptionWithSpacesInValue() { var args = new [] { "--option=Value with spaces" }; var parser = new OptionsParser(); parser.WithOption("option"); parser.Parse(args); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual("option", parser.ParsedOptions.First().Flag.LongName); Assert.AreEqual("Value with spaces", parser.ParsedOptions.First().Value); } [Test] public void ShouldParseShortOptionWithSeparatedValue() { var args = new [] { "-n", "123" }; var parser = new OptionsParser(); parser.WithOption('n'); parser.Parse(args); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual('n', parser.ParsedOptions.First().Flag.ShortName); Assert.AreEqual(123, parser.ParsedOptions.First().Value); } [Test] public void ShouldRecreateUnparsedArguments() { var args = new [] { "--expected", "-x", "value", "-y1", "--another-expected", "-Aw", "-z'this was unexpected'" }; var parser = new OptionsParser(); parser.WithOption("expected"); parser.WithOption("another-expected"); parser.WithOption('A'); parser.Parse(args); Assert.AreEqual(3, parser.ParsedOptions.Count()); Assert.AreEqual("expected", parser.ParsedOptions.First().Flag.LongName); Assert.AreEqual("another-expected", parser.ParsedOptions.ElementAt(1).Flag.LongName); Assert.AreEqual(@"-x value -y1 -w ""-z'this was unexpected'""", parser.RecreateUnparsedArguments()); } [Test] public void ShouldRecreateMixedShortFlag() { var args = new [] { "-AwB" }; var parser = new OptionsParser(); parser.WithOption('A'); parser.WithOption('B'); parser.Parse(args); Assert.AreEqual(2, parser.ParsedOptions.Count()); Assert.AreEqual('A', parser.ParsedOptions.First().Flag.ShortName); Assert.AreEqual('B', parser.ParsedOptions.Last().Flag.ShortName); Assert.AreEqual("-w", parser.RecreateUnparsedArguments()); } [Test] public void ShouldNotRecreatedParsedValue() { var args = new [] { "--switch", "value" }; var parser = new OptionsParser(); parser.WithOption("switch"); parser.Parse(args); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual(args[1], parser.ParsedOptions.First().Value); Assert.IsEmpty(parser.RecreateUnparsedArguments()); } [Test] public void ShouldRemoveEmptyShortFlagPrefix() { var args = new [] { "-AB" }; var parser = new OptionsParser(); parser.WithOption('A'); parser.WithOption('B'); parser.Parse(args); Assert.AreEqual(2, parser.ParsedOptions.Count()); Assert.AreEqual('A', parser.ParsedOptions.First().Flag.ShortName); Assert.AreEqual('B', parser.ParsedOptions.Last().Flag.ShortName); Assert.AreEqual(string.Empty, parser.RecreateUnparsedArguments()); } [Test] public void ShouldAcceptExpectedValues() { var args = new [] { "-a", "-b", "value-1", "-c", "value-2", "-d", "value-3" }; var parser = new OptionsParser(); parser.WithValue("val1"); parser.WithValue("val2"); parser.WithOption('a'); parser.WithOption('b'); parser.WithOption('c'); parser.WithOption('d'); parser.Parse(args); Assert.AreEqual(4, parser.ParsedOptions.Count()); Assert.AreEqual('a', parser.ParsedOptions.ElementAt(0).Flag.ShortName); Assert.AreEqual('b', parser.ParsedOptions.ElementAt(1).Flag.ShortName); Assert.AreEqual('c', parser.ParsedOptions.ElementAt(2).Flag.ShortName); Assert.AreEqual('d', parser.ParsedOptions.ElementAt(3).Flag.ShortName); Assert.AreEqual(2, parser.Values.Count()); Assert.AreEqual("value-1", parser.Values.ElementAt(0).Value); Assert.AreEqual("value-2", parser.Values.ElementAt(1).Value); Assert.AreEqual("value-3", parser.RecreateUnparsedArguments()); } [Test] public void ShouldParsePositionalValues() { var args = new [] { "value", "value-2" }; var parser = new OptionsParser(); var options = new OptionsWithPositionalValues(); parser.Parse(options, args); Assert.AreEqual(1, parser.Values.Count()); Assert.AreEqual(1, parser.UnexpectedArguments.Count()); Assert.AreEqual("value", options.Value); Assert.AreEqual("value-2", parser.UnexpectedArguments.First().Value); } [Test] public void ShoulNotParseOnMissingRequiredPositionalValues() { var args = new string [0]; var parser = new OptionsParser(); var options = new OptionsWithRequiredPositionalValues(); Assert.AreEqual(false, parser.Parse(options, args)); } [Test] public void ShouldParseOptionWithMultipleValues() { var args = new [] { "-v", "1:2:3" }; var parser = new OptionsParser(); var options = new OptionsWithMultipleValues(); parser.Parse(options, args); Assert.AreEqual(3, options.Values.Length); Assert.AreEqual(1, options.Values[0]); Assert.AreEqual(2, options.Values[1]); Assert.AreEqual(3, options.Values[2]); Assert.AreEqual(0, parser.Values.Count()); Assert.AreEqual(0, parser.UnexpectedArguments.Count()); } [Test] public void ShouldParseOptionWithMultipleValuesWithDefaultDelimiterValue() { var args = new [] { "-m", "this;is;a;test" }; var parser = new OptionsParser(); var options = new OptionsWithMultipleValuesWithDefaultDelimiterValue(); parser.Parse(options, args); Assert.AreEqual(4, options.Values.Length); Assert.AreEqual("this", options.Values[0]); Assert.AreEqual("is", options.Values[1]); Assert.AreEqual("a", options.Values[2]); Assert.AreEqual("test", options.Values[3]); Assert.AreEqual(0, parser.Values.Count()); Assert.AreEqual(0, parser.UnexpectedArguments.Count()); } [Test] public void ShouldParseEnum() { var args = new [] { "-v", "Y" }; var parser = new OptionsParser(); var options = new OptionsWithEnum(); parser.Parse(options, args); Assert.AreEqual(Enum.Y, options.Value); } [Test] public void ShouldParseEnumPositionalArgument() { var args = new [] { "Y" }; var parser = new OptionsParser(); var options = new OptionsWithPositionalEnumArgument(); parser.Parse(options, args); Assert.AreEqual(Enum.Y, options.Value); } [Test] public void ShouldHandleIntOptionWithDefaultValueFollowedByString() { var args = new [] { "--value", "test" }; var parser = new OptionsParser(new ParserConfiguration { AllowUnexpectedArguments = true }); var options = new OptionsWithInt(); parser.Parse(options, args); Assert.AreEqual(-1, options.Value); Assert.AreEqual(1, parser.UnexpectedArguments.Count()); Assert.AreEqual("test", parser.UnexpectedArguments.First().Value); Assert.AreEqual("test", parser.RecreateUnparsedArguments()); } [Test] public void ShouldNotParseAfterDoubleHyphen() { var args = new [] { "--", "--value", "test" }; var parser = new OptionsParser(new ParserConfiguration { AllowUnexpectedArguments = true }); var options = new OptionsWithInt(); parser.Parse(options, args); Assert.AreEqual(-1, options.Value); Assert.AreEqual(0, parser.ParsedOptions.Count()); Assert.AreEqual(2, parser.UnexpectedArguments.Count()); Assert.AreEqual("--value", parser.UnexpectedArguments.ElementAt(0).Value); Assert.AreEqual("test", parser.UnexpectedArguments.ElementAt(1).Value); Assert.AreEqual("--value test", parser.RecreateUnparsedArguments()); } [Test] public void ShouldThrowAnExceptionOnUnexpectedMultipleOccurencesOfArgument() { var args = new[] { "--value", "5", "--value", "6" }; var parser = new OptionsParser(new ParserConfiguration { ThrowValidationException = true }); var options = new OptionsWithInt(); Assert.Throws(() => parser.Parse(options, args)); } [Test] public void ShouldHandleMultipleOccurencesOfArgument() { var args = new[] { "-v", "5", "-v", "6" }; var parser = new OptionsParser(); var options = new OptionsWithMultipleValues(); parser.Parse(options, args); Assert.AreEqual(2, options.Values.Length); Assert.AreEqual(5, options.Values[0]); Assert.AreEqual(6, options.Values[1]); } [Test] public void ShouldRecreateUnparsedArgument1() { var args = new[] { "positional argument", "--wrong-arg", "-p8888" }; var parser = new OptionsParser(); parser.WithOption('p'); var options = new OptionsWithMultipleArguments(); parser.Parse(options, args); Assert.AreEqual("positional argument", options.Value); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual('p', parser.ParsedOptions.First().Flag.ShortName); Assert.AreEqual(8888, parser.ParsedOptions.First().Value); Assert.AreEqual(1, parser.UnexpectedArguments.Count()); Assert.AreEqual("wrong-arg", parser.UnexpectedArguments.ElementAt(0).Value); Assert.AreEqual("--wrong-arg", parser.RecreateUnparsedArguments()); } [Test] public void ShouldRecreateUnparsedArgument2() { var args = new[] { "positional argument", "--wrong-arg", "-p", "8888" }; var parser = new OptionsParser(); parser.WithOption('p'); var options = new OptionsWithMultipleArguments(); parser.Parse(options, args); Assert.AreEqual("positional argument", options.Value); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual('p', parser.ParsedOptions.First().Flag.ShortName); Assert.AreEqual(8888, parser.ParsedOptions.First().Value); Assert.AreEqual(1, parser.UnexpectedArguments.Count()); Assert.AreEqual("wrong-arg", parser.UnexpectedArguments.ElementAt(0).Value); Assert.AreEqual("--wrong-arg", parser.RecreateUnparsedArguments()); } [Test] public void ShouldRecreateUnparsedArgument3() { var args = new[] { "positional argument", "-p8888", "--wrong-arg" }; var parser = new OptionsParser(); parser.WithOption('p'); var options = new OptionsWithMultipleArguments(); parser.Parse(options, args); Assert.AreEqual("positional argument", options.Value); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual('p', parser.ParsedOptions.First().Flag.ShortName); Assert.AreEqual(8888, parser.ParsedOptions.First().Value); Assert.AreEqual(1, parser.UnexpectedArguments.Count()); Assert.AreEqual("wrong-arg", parser.UnexpectedArguments.ElementAt(0).Value); Assert.AreEqual("--wrong-arg", parser.RecreateUnparsedArguments()); } [Test] public void ShouldRecreateUnparsedArgument4() { var args = new[] { "positional argument", "--wrong-arg", "--port", "8888" }; var parser = new OptionsParser(); parser.WithOption("port"); var options = new OptionsWithMultipleArguments(); parser.Parse(options, args); Assert.AreEqual("positional argument", options.Value); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual("port", parser.ParsedOptions.ToArray()[0].Flag.LongName); Assert.AreEqual(8888, parser.ParsedOptions.ToArray()[0].Value); Assert.AreEqual(1, parser.UnexpectedArguments.Count()); Assert.AreEqual("wrong-arg", parser.UnexpectedArguments.ElementAt(0).Value); Assert.AreEqual("--wrong-arg", parser.RecreateUnparsedArguments()); } [Test] public void ShouldRecreateUnparsedArgument5() { var args = new[] { "positional argument", "--wrong-arg", "--port=8888" }; var parser = new OptionsParser(); parser.WithOption("port"); var options = new OptionsWithMultipleArguments(); parser.Parse(options, args); Assert.AreEqual("positional argument", options.Value); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual("port", parser.ParsedOptions.ToArray()[0].Flag.LongName); Assert.AreEqual(8888, parser.ParsedOptions.ToArray()[0].Value); Assert.AreEqual(1, parser.UnexpectedArguments.Count()); Assert.AreEqual("wrong-arg", parser.UnexpectedArguments.ElementAt(0).Value); Assert.AreEqual("--wrong-arg", parser.RecreateUnparsedArguments()); } [Test] public void ShouldRecreateUnparsedArgument6() { var args = new[] { "positional argument", "--port", "8888", "--wrong-arg" }; var parser = new OptionsParser(); parser.WithOption("port"); var options = new OptionsWithMultipleArguments(); parser.Parse(options, args); Assert.AreEqual("positional argument", options.Value); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual("port", parser.ParsedOptions.ToArray()[0].Flag.LongName); Assert.AreEqual(8888, parser.ParsedOptions.ToArray()[0].Value); Assert.AreEqual(1, parser.UnexpectedArguments.Count()); Assert.AreEqual("wrong-arg", parser.UnexpectedArguments.ElementAt(0).Value); Assert.AreEqual("--wrong-arg", parser.RecreateUnparsedArguments()); } [Test] public void ShouldRecreateUnparsedArgument7() { var args = new[] { "positional argument", "--port=8888", "--wrong-arg" }; var parser = new OptionsParser(); parser.WithOption("port"); var options = new OptionsWithMultipleArguments(); parser.Parse(options, args); Assert.AreEqual("positional argument", options.Value); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual("port", parser.ParsedOptions.ToArray()[0].Flag.LongName); Assert.AreEqual(8888, parser.ParsedOptions.ToArray()[0].Value); Assert.AreEqual(1, parser.UnexpectedArguments.Count()); Assert.AreEqual("wrong-arg", parser.UnexpectedArguments.ElementAt(0).Value); Assert.AreEqual("--wrong-arg", parser.RecreateUnparsedArguments()); } [Test] public void ShouldRecreateUnparsedArgument8() { var args = new[] { "--wrong-arg", "-n123" }; var parser = new OptionsParser(); parser.WithOption('n'); parser.Parse(args); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual('n', parser.ParsedOptions.First().Flag.ShortName); Assert.AreEqual(123, parser.ParsedOptions.First().Value); Assert.AreEqual(1, parser.UnexpectedArguments.Count()); Assert.AreEqual("wrong-arg", parser.UnexpectedArguments.ElementAt(0).Value); Assert.AreEqual("--wrong-arg", parser.RecreateUnparsedArguments()); } [Test] public void ShouldRecreateUnparsedArgument9() { var args = new[] { "--wrong-arg", "-n", "123" }; var parser = new OptionsParser(); parser.WithOption('n'); parser.Parse(args); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual('n', parser.ParsedOptions.First().Flag.ShortName); Assert.AreEqual(123, parser.ParsedOptions.First().Value); Assert.AreEqual(1, parser.UnexpectedArguments.Count()); Assert.AreEqual("wrong-arg", parser.UnexpectedArguments.ElementAt(0).Value); Assert.AreEqual("--wrong-arg", parser.RecreateUnparsedArguments()); } [Test] public void ShouldRecreateUnparsedArgument10() { var args = new[] { "--no-xwt", "--port", "8888" }; var parser = new OptionsParser(); parser.WithOption("port"); parser.Parse(args); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual("port", parser.ParsedOptions.First().Flag.LongName); Assert.AreEqual(8888, parser.ParsedOptions.First().Value); Assert.AreEqual(1, parser.UnexpectedArguments.Count()); Assert.AreEqual("no-xwt", parser.UnexpectedArguments.ElementAt(0).Value); Assert.AreEqual("--no-xwt", parser.RecreateUnparsedArguments()); } [Test] public void ShouldRecreateUnparsedArgument11() { var args = new[] { "--no-xwt", "--port=8888" }; var parser = new OptionsParser(); parser.WithOption("port"); parser.Parse(args); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual("port", parser.ParsedOptions.First().Flag.LongName); Assert.AreEqual(8888, parser.ParsedOptions.First().Value); Assert.AreEqual(1, parser.UnexpectedArguments.Count()); Assert.AreEqual("no-xwt", parser.UnexpectedArguments.ElementAt(0).Value); Assert.AreEqual("--no-xwt", parser.RecreateUnparsedArguments()); } [Test] public void ShouldRecreateUnparsedArgument12() { var args = new[] { "-n123", "--wrong-arg" }; var parser = new OptionsParser(); parser.WithOption('n'); parser.Parse(args); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual('n', parser.ParsedOptions.First().Flag.ShortName); Assert.AreEqual(123, parser.ParsedOptions.First().Value); Assert.AreEqual(1, parser.UnexpectedArguments.Count()); Assert.AreEqual("wrong-arg", parser.UnexpectedArguments.ElementAt(0).Value); Assert.AreEqual("--wrong-arg", parser.RecreateUnparsedArguments()); } [Test] public void ShouldRecreateUnparsedArgument13() { var args = new[] { "-n", "123", "--wrong-arg" }; var parser = new OptionsParser(); parser.WithOption('n'); parser.Parse(args); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual('n', parser.ParsedOptions.First().Flag.ShortName); Assert.AreEqual(123, parser.ParsedOptions.First().Value); Assert.AreEqual(1, parser.UnexpectedArguments.Count()); Assert.AreEqual("wrong-arg", parser.UnexpectedArguments.ElementAt(0).Value); Assert.AreEqual("--wrong-arg", parser.RecreateUnparsedArguments()); } [Test] public void ShouldRecreateUnparsedArgument14() { var args = new[] { "--port", "8888", "--no-xwt" }; var parser = new OptionsParser(); parser.WithOption("port"); parser.Parse(args); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual("port", parser.ParsedOptions.First().Flag.LongName); Assert.AreEqual(8888, parser.ParsedOptions.First().Value); Assert.AreEqual(1, parser.UnexpectedArguments.Count()); Assert.AreEqual("no-xwt", parser.UnexpectedArguments.ElementAt(0).Value); Assert.AreEqual("--no-xwt", parser.RecreateUnparsedArguments()); } [Test] public void ShouldRecreateUnparsedArgument15() { var args = new[] { "--port=8888", "--no-xwt" }; var parser = new OptionsParser(); parser.WithOption("port"); parser.Parse(args); Assert.AreEqual(1, parser.ParsedOptions.Count()); Assert.AreEqual("port", parser.ParsedOptions.First().Flag.LongName); Assert.AreEqual(8888, parser.ParsedOptions.First().Value); Assert.AreEqual(1, parser.UnexpectedArguments.Count()); Assert.AreEqual("no-xwt", parser.UnexpectedArguments.ElementAt(0).Value); Assert.AreEqual("--no-xwt", parser.RecreateUnparsedArguments()); } [OneTimeSetUp] public void ConfigureOutput() { var sw = new StringWriter(); System.Console.SetOut(sw); System.Console.SetError(sw); } private class OptionsWithInt { [DefaultValue(-1)] public int Value { get; set; } } private class OptionsWithPositionalEnumArgument { [PositionalArgument(0)] public Enum Value { get; set; } } private class OptionsWithEnum { public Enum Value { get; set; } } private enum Enum { X, Y, Z } private class OptionsWithMultipleValues { [Name('v'), NumberOfElements(3), Delimiter(':')] public int[] Values { get; set; } } private class OptionsWithMultipleValuesWithDefaultDelimiterValue { [Name('m')] public string[] Values { get; set; } } private class OptionsWithBool { [Name('s'), DefaultValue(false)] public bool Switch { get; set; } } private class OptionsWithPositionalValues { [PositionalArgument(0), Name("value")] public string Value { get; set; } } private class OptionsWithRequiredPositionalValues { [Required, PositionalArgument(0), Name("value")] public string Value { get; set; } } private class OptionsWithMultipleArguments { [PositionalArgument(0), Name("value")] public string Value { get; set; } [PositionalArgument(1)] public string Arg2 { get; set; } [PositionalArgument(2)] public string Arg3 { get; set; } [PositionalArgument(3)] public string Arg4 { get; set; } } } }