public void ExtraParameterParseTest()
        {
            string inputCommand       = "blah --zaxxar";
            ExtendedCommandParser app = OneArgStandardSetupAndParse(inputCommand, out CommandArgument theArg);

            Assert.Equal(theArg.Value, "blah");
            Assert.True(app.RemainingParameters.ContainsKey("--zaxxar"), "extra parameter '--zaxxar' not properly parsed");
        }
        public void ArgParseTest()
        {
            string inputArgs          = "test --help --locale fr-FR";
            ExtendedCommandParser app = OneArgStandardSetupAndParse(inputArgs, out CommandArgument theArg);

            Assert.Equal(theArg.Value, "test");
            Assert.True(app.InternalParamHasValue("--help"));
            Assert.True(app.InternalParamHasValue("--locale"));
            Assert.Equal(app.InternalParamValue("--locale"), "fr-FR");
            Assert.False(app.RemainingParameters.Any(), string.Format("Unknown extra args: {0}", string.Join("|", app.RemainingParameters.Keys)));
        }
        // This is based on the input args for Program.cs, but doesn't need to be.
        // The tests in this class are isolated to testing ExtendedCommandParser. Any setup here is specific to the tests.
        // Do NOT expect the args to be the same as the real args.
        private static void SetupTestCommands(ExtendedCommandParser appExt)
        {
            // visible
            appExt.InternalOption("-l|--list", "--list", "List templates containing the specified name.", CommandOptionType.NoValue);
            appExt.InternalOption("-n|--name", "--name", "The name for the output being created. If no name is specified, the name of the current directory is used.", CommandOptionType.SingleValue);
            appExt.InternalOption("-h|--help", "--help", "Display help for the indicated template's parameters.", CommandOptionType.NoValue);

            // hidden
            appExt.HiddenInternalOption("-d|--dir", "--dir", CommandOptionType.NoValue);
            appExt.HiddenInternalOption("-a|--alias", "--alias", CommandOptionType.SingleValue);
            appExt.HiddenInternalOption("-x|--extra-args", "--extra-args", CommandOptionType.MultipleValue);
            appExt.HiddenInternalOption("--locale", "--locale", CommandOptionType.SingleValue);
            appExt.HiddenInternalOption("--quiet", "--quiet", CommandOptionType.NoValue);
            appExt.HiddenInternalOption("-i|--install", "--install", CommandOptionType.MultipleValue);

            // reserved but not currently used
            appExt.HiddenInternalOption("-up|--update", "--update", CommandOptionType.MultipleValue);
            appExt.HiddenInternalOption("-u|--uninstall", "--uninstall", CommandOptionType.MultipleValue);
            appExt.HiddenInternalOption("--skip-update-check", "--skip-update-check", CommandOptionType.NoValue);
        }
        private static ExtendedCommandParser OneArgStandardSetupAndParse(string inputCommand, out CommandArgument theArg)
        {
            string[] inputArgArray = inputCommand.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

            ExtendedCommandParser app = new ExtendedCommandParser()
            {
                Name     = "TestApp",
                FullName = "Testing ExtendedCommandParser"
            };

            SetupTestCommands(app);
            theArg = app.Argument("theArg", "arg description");

            app.OnExecute(() =>
            {
                app.ParseArgs();
                return(Task.FromResult(CreationResultStatus.Success));
            });
            app.Execute(inputArgArray);

            return(app);
        }