Exemple #1
0
 public static void Main(string[] args)
 {
     var parser = new OptionsParser(new ParserConfiguration 
     { 
         GenerateHelp = true,
         CustomFooterGenerator = () => "All unparsed options will be forwarded to CLI application.",
         CustomUsageLineGenerator = usageLine => usageLine + " [script]",
         AllowUnexpectedArguments = true
     });
     
     var options = new Options();
     if(!parser.Parse(options, args))
     {
         return;
     }
     
     var mode = options.Debug ? "Debug" : "Release";
     var monoOptions = options.Debug ? "--debug" : string.Empty;
     
     if(options.DebuggerSocketPort != -1)
     {
         monoOptions += string.Format(" --debugger-agent=transport=dt_socket,address=127.0.0.1:{0},server=y", options.DebuggerSocketPort);
         Console.WriteLine("Listening on port {0}", options.DebuggerSocketPort);
     }
     
     var rootPath = (options.RootPath == ".") ? Environment.CurrentDirectory : options.RootPath;
     Console.WriteLine("Running in {0} mode.\nROOT_PATH={1}", mode, rootPath);
     
     var binaryPath = Path.Combine(rootPath, "output", mode, "CLI.exe");
     var optionsToPass = parser.RecreateUnparsedArguments();
     if(options.HelpCLI)
     {
         Console.WriteLine("NOTE: showing help from binary: {0}", binaryPath);
         optionsToPass = "******";
     }
     
     var process = new Process();
     process.StartInfo.FileName = "mono";
     process.StartInfo.Arguments = string.Format("{0} {1} {2}", monoOptions, binaryPath, optionsToPass);
     
     if(options.Quiet)
     {
         process.StartInfo.RedirectStandardError = true;
         process.StartInfo.UseShellExecute = false;
     }
     
     process.Start();
     if(options.Quiet)
     {
         process.StandardError.Close();
     }
     
     process.WaitForExit();
 } 
        public void ShouldNotRecreatedParsedValue()
        {
            var args   = new [] { "--switch", "value" };
            var parser = new OptionsParser();

            parser.WithOption <string>("switch");

            parser.Parse(args);

            Assert.AreEqual(1, parser.ParsedOptions.Count());
            Assert.AreEqual(args[1], parser.ParsedOptions.First().Value);
            Assert.IsEmpty(parser.RecreateUnparsedArguments());
        }
        public void ShouldRemoveEmptyShortFlagPrefix()
        {
            var args   = new [] { "-AB" };
            var parser = new OptionsParser();

            parser.WithOption <bool>('A');
            parser.WithOption <bool>('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());
        }
        public void ShouldRecreateMixedShortFlag()
        {
            var args   = new [] { "-AwB" };
            var parser = new OptionsParser();

            parser.WithOption <bool>('A');
            parser.WithOption <bool>('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());
        }
        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());
        }
        public void ShouldRecreateUnparsedArgument13()
        {
            var args   = new[] { "-n", "123", "--wrong-arg" };
            var parser = new OptionsParser();

            parser.WithOption <int>('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());
        }
        public void ShouldRecreateUnparsedArgument15()
        {
            var args   = new[] { "--port=8888", "--no-xwt" };
            var parser = new OptionsParser();

            parser.WithOption <int>("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());
        }
        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());
        }
        public void ShouldRecreateUnparsedArgument3()
        {
            var args   = new[] { "positional argument", "-p8888", "--wrong-arg" };
            var parser = new OptionsParser();

            parser.WithOption <int>('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());
        }
        public void ShouldRecreateUnparsedArgument7()
        {
            var args   = new[] { "positional argument", "--port=8888", "--wrong-arg" };
            var parser = new OptionsParser();

            parser.WithOption <int>("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());
        }
        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<bool>('a');
            parser.WithOption<bool>('b');
            parser.WithOption<bool>('c');
            parser.WithOption<bool>('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());
        }
        public void ShouldRecreateUnparsedArguments()
        {
            var args = new [] {
                "--expected",
                "-x",
                "value",
                "-y1",
                "--another-expected",
                "-Aw",
                "-z'this was unexpected'"
            };
            var parser = new OptionsParser();

            parser.WithOption <bool>("expected");
            parser.WithOption <bool>("another-expected");
            parser.WithOption <bool>('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());
        }
        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 <bool>('a');
            parser.WithOption <bool>('b');
            parser.WithOption <bool>('c');
            parser.WithOption <bool>('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());
        }
        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());
        }
Exemple #15
0
        public static void Main(string[] args)
        {
            var basicOptions  = new BasicOptions();
            var optionsParser = new OptionsParser(new ParserConfiguration
            {
                GenerateHelp             = false,
                AllowUnexpectedArguments = true
            });

            // here we parse only one option - `root-directory`
            // the rest will be parsed in the second phase
            if (!optionsParser.Parse(basicOptions, args))
            {
                return;
            }

            optionsParser = new OptionsParser(new ParserConfiguration
            {
                GenerateHelp             = true,
                CustomFooterGenerator    = () => "All unparsed options will be forwarded to launched application.",
                CustomUsageLineGenerator = usageLine => usageLine + " [script]",
                AllowUnexpectedArguments = true
            });

            var addHelpSwitch     = false;
            var possibleLaunchees = new List <LaunchDescriptorsGroup>();
            var selectedLaunchees = new List <LaunchDescriptorsGroup>();

            var interestingBinaries = Scanner.ScanForInterestingBinaries(basicOptions.RootPath).OrderBy(x => x.Priority).ThenBy(x => x.Name).ToArray();

            for (var i = 0; i < interestingBinaries.Length; i++)
            {
                var j = i;
                possibleLaunchees.Add(interestingBinaries[i]);
                interestingBinaries[i].GenerateSwitches(optionsParser, i == 0);
                interestingBinaries[i].SwitchOption.Parsed += (option, value) =>
                {
                    selectedLaunchees.Add(interestingBinaries[j]);
                };

                if (interestingBinaries[i].HelpOption != null)
                {
                    interestingBinaries[i].HelpOption.Parsed += (option, value) =>
                    {
                        addHelpSwitch = true;
                    };
                }
            }

            // here we parse all of the options again
            // as only now we know which launch targets
            // and configurations are available in the
            // system
            var options = new Options();

            if (!optionsParser.Parse(options, args))
            {
                return;
            }

            var conf = options.Debug ? LaunchDescriptor.Configuration.Debug : LaunchDescriptor.Configuration.Release;
            LaunchDescriptorsGroup selectedGroup    = null;
            LaunchDescriptor       selectedLaunchee = null;

            if (selectedLaunchees.Count == 0)
            {
                if (possibleLaunchees.Count == 0)
                {
                    Console.Error.WriteLine("There is no launch target specified. Exiting");
                    Environment.Exit(1);
                }

                selectedGroup = possibleLaunchees.OrderBy(x => x.Priority).ThenBy(x => x.Name).First();
            }
            else if (selectedLaunchees.Count > 1)
            {
                Console.Error.WriteLine("Only one launch target can be used. Exiting");
                Environment.Exit(1);
            }
            else
            {
                selectedGroup = selectedLaunchees.First();
            }

            selectedLaunchee = selectedGroup.ForConfiguration(conf);
            if (selectedLaunchee == null)
            {
                Console.Error.WriteLine("Selected target {0} is not available in {1} configuration.", selectedGroup.Name, conf);
                Environment.Exit(1);
            }

#if !PLATFORM_WINDOWS
            // it is not so easy to remotely debug on .NET, so we do not support it
            var monoOptions = options.Debug ? "--debug" : string.Empty;

            if (options.DebuggerSocketPort != -1)
            {
                monoOptions += string.Format(" --debugger-agent=transport=dt_socket,address=127.0.0.1:{0},server=y", options.DebuggerSocketPort);
                Console.WriteLine("Listening on port {0}", options.DebuggerSocketPort);
            }
#endif

            var optionsToPass = optionsParser.RecreateUnparsedArguments();
            if (addHelpSwitch)
            {
                Console.WriteLine("NOTE: showing help from binary: {0}", selectedLaunchee.Name);
                optionsToPass = "******";
            }

            var process = new Process();
#if PLATFORM_WINDOWS
            process.StartInfo.FileName  = selectedLaunchee.Path;
            process.StartInfo.Arguments = optionsToPass;
#else
            process.StartInfo.FileName  = "mono";
            process.StartInfo.Arguments = string.Format("{0} {1} {2}", monoOptions, selectedLaunchee.Path, optionsToPass);
#endif

            if (options.Quiet)
            {
                process.StartInfo.RedirectStandardError = true;
                process.StartInfo.UseShellExecute       = false;
            }

            process.Start();
            if (options.Quiet)
            {
                process.StandardError.Close();
            }

            process.WaitForExit();
        }
Exemple #16
0
        public static void Main(string[] args)
        {
            var basicOptions = new BasicOptions();
            var optionsParser = new OptionsParser(new ParserConfiguration
            {
                GenerateHelp = false,
                AllowUnexpectedArguments = true
            });

            // here we parse only one option - `root-directory`
            // the rest will be parsed in the second phase
            if(!optionsParser.Parse(basicOptions, args))
            {
                return;
            }

            optionsParser = new OptionsParser(new ParserConfiguration
            {
                GenerateHelp = true,
                CustomFooterGenerator = () => "All unparsed options will be forwarded to launched application.",
                CustomUsageLineGenerator = usageLine => usageLine + " [script]",
                AllowUnexpectedArguments = true
            });

            var addHelpSwitch = false;
            var possibleLaunchees = new List<LaunchDescriptorsGroup>();
            var selectedLaunchees = new List<LaunchDescriptorsGroup>();

            var interestingBinaries = Scanner.ScanForInterestingBinaries(basicOptions.RootPath).OrderBy(x => x.Priority).ThenBy(x => x.Name).ToArray();
            for(var i = 0; i < interestingBinaries.Length; i++) 
            {
                var j = i;
                possibleLaunchees.Add(interestingBinaries[i]);
                interestingBinaries[i].GenerateSwitches(optionsParser, i == 0);
                interestingBinaries[i].SwitchOption.Parsed += (option, value) =>
                {
                    selectedLaunchees.Add(interestingBinaries[j]);
                };

                if(interestingBinaries[i].HelpOption != null)
                {
                    interestingBinaries[i].HelpOption.Parsed += (option, value) =>
                    {
                        addHelpSwitch = true;
                    };
                }
            }

            // here we parse all of the options again
            // as only now we know which launch targets
            // and configurations are available in the
            // system
            var options = new Options();
            if(!optionsParser.Parse(options, args))
            {
                return;
            }

            var conf = options.Debug ? LaunchDescriptor.Configuration.Debug : LaunchDescriptor.Configuration.Release;
            LaunchDescriptorsGroup selectedGroup = null;
            LaunchDescriptor selectedLaunchee = null;
            if(selectedLaunchees.Count == 0)
            {
                if(possibleLaunchees.Count == 0)
                {
                    Console.Error.WriteLine("There is no launch target specified. Exiting");
                    Environment.Exit(1);
                }

                selectedGroup = possibleLaunchees.OrderBy(x => x.Priority).ThenBy(x => x.Name).First();
            }
            else if(selectedLaunchees.Count > 1)
            {
                Console.Error.WriteLine("Only one launch target can be used. Exiting");
                Environment.Exit(1);
            }
            else
            {
                selectedGroup = selectedLaunchees.First();
            }

            selectedLaunchee = selectedGroup.ForConfiguration(conf);
            if(selectedLaunchee == null)
            {
                Console.Error.WriteLine("Selected target {0} is not available in {1} configuration.", selectedGroup.Name, conf);
                Environment.Exit(1);
            }

            var monoOptions = options.Debug ? "--debug" : string.Empty;

            if(options.DebuggerSocketPort != -1)
            {
                monoOptions += string.Format(" --debugger-agent=transport=dt_socket,address=127.0.0.1:{0},server=y", options.DebuggerSocketPort);
                Console.WriteLine("Listening on port {0}", options.DebuggerSocketPort);
            }

            var optionsToPass = optionsParser.RecreateUnparsedArguments();
            if(addHelpSwitch)
            {
                Console.WriteLine("NOTE: showing help from binary: {0}", selectedLaunchee.Name);
                optionsToPass = "******";
            }

            var process = new Process();
            process.StartInfo.FileName = "mono";
            process.StartInfo.Arguments = string.Format("{0} {1} {2}", monoOptions, selectedLaunchee.Path, optionsToPass);

            if(options.Quiet)
            {
                process.StartInfo.RedirectStandardError = true;
                process.StartInfo.UseShellExecute = false;
            }

            process.Start();
            if(options.Quiet)
            {
                process.StandardError.Close();
            }

            process.WaitForExit();
        }
        public void ShouldRecreateUnparsedArguments()
        {
            var args = new [] {
                "--expected",
                "-x",
                "value",
                "-y1",
                "--another-expected",
                "-Aw",
                "-z'this was unexpected'"
            };
            var parser = new OptionsParser();
            parser.WithOption<bool>("expected");
            parser.WithOption<bool>("another-expected");
            parser.WithOption<bool>('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());
        }
        public void ShouldRemoveEmptyShortFlagPrefix()
        {
            var args = new [] { "-AB" };
            var parser = new OptionsParser();
            parser.WithOption<bool>('A');
            parser.WithOption<bool>('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());
        }
        public void ShouldNotRecreatedParsedValue()
        {
            var args = new [] { "--switch", "value" };
            var parser = new OptionsParser();
            parser.WithOption<string>("switch");

            parser.Parse(args);

            Assert.AreEqual(1, parser.ParsedOptions.Count());
            Assert.AreEqual(args[1], parser.ParsedOptions.First().Value);
            Assert.IsEmpty(parser.RecreateUnparsedArguments());
        }
        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());
        }
        public void ShouldRecreateMixedShortFlag()
        {
            var args = new [] { "-AwB" };
            var parser = new OptionsParser();
            parser.WithOption<bool>('A');
            parser.WithOption<bool>('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());
        }