public void MissingParameterTest()
        {
            ParameterSetCollection sets = ParameterSetCollection.FromTypes(typeof(ParamSet));
            NodeSequence args = this.Parse("");
            ResolveResult result = sets.Resolve(new ParameterSetBinder(),
                                                DefaultActivator.Instance,
                                                new IntransigentTypeConverter(),
                                                CultureInfo.InvariantCulture,
                                                args);

            Assert.False(result.IsMatch, "Expects no match");
            Assert.Equal(1, result.Count);
            Assert.Equal(1, result.BestMatch.Errors.Length);
            ErrorWriter writer = new ErrorWriter();
            using (StringWriter strWriter = new StringWriter())
            {
                writer.Write(strWriter, result);
                string output = strWriter.ToString();
                Assert.Contains("Missing requried paramter: 'ABool'.", output);
                Assert.Contains("A bool", output);
                Assert.Contains("Required?                True", output);
                Assert.Contains("Position?                named", output);
                Assert.Contains("Default value            None", output);
                Assert.Contains("Parameter sets           Set1", output);
            }
        }
        static void Main(string[] args)
        {
            /*
             *  simple usage
             */

            // set up argument parser
            ArgumentParser<ExecuteCommandBase> argParser = new ArgumentParser<ExecuteCommandBase>(typeof(ExecuteCommandUsingName), typeof(ExecuteCommandUsingPath));
            ExecuteCommandBase paramSet;
            if (argParser.TryParse(args, out paramSet))
            {
                paramSet.Execute();
            }

            Console.ReadLine();

            /*
            *  advanced usage
            */

            // create parameter set collection from types
            ParameterSetCollection sets = ParameterSetCollection.FromTypes(typeof(ExecuteCommandUsingName), typeof(ExecuteCommandUsingPath));

            // parse the command line arguments
            Parser parser = new Parser();
            NodeSequence nodes = parser.Parse(string.Join(" ", args));

            // resolve parameter set against the parsed node set
            ResolveResult result = sets.Resolve(new ParameterSetBinder(),
                                                DefaultActivator.Instance,
                                                new IntransigentTypeConverter(),
                                                CultureInfo.InvariantCulture,
                                                nodes);
            if (result.IsMatch)
            {
                paramSet = (ExecuteCommandBase)result.BestMatch.Object;
                paramSet.Execute();
            }
            else
            {
                ErrorWriter errorWriter = new ErrorWriter();
                errorWriter.Write(new ConsoleWriter(Console.Error), result);

                HelpWriter helpWriter = new HelpWriter();
                helpWriter.Write(new ConsoleWriter(Console.Out), sets, HelpLevel.Parameters);
            }
        }