示例#1
0
        /// <summary>
        /// An easy factory method that uses an object's properties to
        /// define the command line arguments required for the application.
        /// </summary>
        /// <typeparam name="T">The object class to initialize.</typeparam>
        /// <param name="pOptions">The parser options</param>
        /// <param name="pArgs">The command line arguments.</param>
        /// <returns>A new class T with it's properties populated, or Null if command line arguments are invalid.</returns>
        public static T Create <T>(CliOptions pOptions, IEnumerable <string> pArgs) where T : class, new()
        {
            PropertyInfo[]     infos   = typeof(T).GetProperties();
            string             pattern = ReflectDescriptions <T>(pOptions, infos);
            List <Description> descs   = DescriptionFactory.Create(pOptions, new HelpReflection(typeof(T)), pattern);

            Request request = Create(pOptions, pArgs, descs, new ConsoleFactory());

            if (!request.Valid)
            {
                return(null);
            }

            T instance = Activator.CreateInstance <T>();

            foreach (Description desc in descs)
            {
                PropertyInfo info = ReflectProperty(infos, desc.Name);
                if (!request.Contains(desc.Name) || info == null)
                {
                    continue;
                }
                // TODO: Support multiples
                info.SetValue(instance, Convert.ChangeType(request.First(desc.Name).Value, info.PropertyType));
            }

            return(instance);
        }
        private static void AssertNamed(CliOptions pOptions, string pPattern)
        {
            Description desc = DescriptionFactory.Parse(pOptions, new MockHelpProvider(), pPattern);

            Assert.AreEqual(eROLE.NAMED, desc.Role);

            AssertTypes(pOptions, pPattern);
        }
        private static void AssertMultiple(CliOptions pOptions, string pPattern)
        {
            Description desc = DescriptionFactory.Parse(pOptions, new MockHelpProvider(), pPattern);

            Assert.AreEqual(eMULTIPLICITY.MULTIPLE, desc.Multiplicity);

            AssertOptional(pOptions, "[" + pPattern + "]");
        }
        private static void AssertType <T>(CliOptions pOptions, string pPattern)
        {
            Description desc = DescriptionFactory.Parse(pOptions, new MockHelpProvider(), pPattern);

            Assert.IsNotNull(desc.Type);
            Assert.IsTrue(desc.Type is T);

            AssertMultiple(pOptions, pPattern + "#");
            AssertOptional(pOptions, "[" + pPattern + "]");
        }
示例#5
0
        public void Validator_1()
        {
            Validator v = new Validator(null);

            List <Description> descs = DescriptionFactory.Create(CliOptions.WindowsStyle, new MockHelpProvider(),
                                                                 "/width:int");
            Request request = RequestFactory.Create(CliOptions.WindowsStyle, new string[0], descs,
                                                    new MockOutputFactory());

            Assert.IsTrue(v.Validate(descs, request));
        }
        private static void AssertParsable(CliOptions pOptions, string pName)
        {
            Description desc = DescriptionFactory.Parse(pOptions, new MockHelpProvider(), pName);

            Assert.AreEqual(pName, desc.Name);
            Assert.AreEqual(eSCOPE.REQUIRED, desc.Scope);
            Assert.AreEqual(eMULTIPLICITY.ONCE, desc.Multiplicity);

            AssertPassed(pOptions, pName);
            AssertNamed(pOptions, pOptions.Prefix + pName);
        }
示例#7
0
        public void SelectMissingValue()
        {
            List <Description> descs = DescriptionFactory.Create(CliOptions.WindowsStyle, new MockHelpProvider(),
                                                                 "/width:int");
            Request request = RequestFactory.Create(CliOptions.WindowsStyle, new[] { "/width" }, descs,
                                                    new MockOutputFactory());

            Description[] missingValue = Validator.SelectMissingValue(descs, request).ToArray();

            Assert.AreEqual(1, missingValue.Length);
            Assert.AreEqual("width", missingValue[0].Name);
        }
示例#8
0
        public void SelectDuplicates()
        {
            List <Description> descs = DescriptionFactory.Create(CliOptions.WindowsStyle, new MockHelpProvider(),
                                                                 "/width:int");
            Request request = RequestFactory.Create(CliOptions.WindowsStyle, new[] { "/width:10", "/width:20" }, descs,
                                                    new MockOutputFactory());

            Description[] duplicates = Validator.SelectDuplicates(descs, request).ToArray();

            Assert.AreEqual(1, duplicates.Length);
            Assert.AreEqual("width", duplicates[0].Name);
        }
示例#9
0
        public void Validate()
        {
            List <Description> descs = DescriptionFactory.Create(CliOptions.WindowsStyle, new MockHelpProvider(),
                                                                 "/width:int");
            Validator v = new Validator(new OutputMessages(CliOptions.WindowsStyle, new MockOutput()));

            Assert.IsTrue(v.Validate(descs,
                                     RequestFactory.Create(CliOptions.WindowsStyle, new[] { "/width:10" }, descs, new MockOutputFactory())));
            Assert.IsFalse(v.Validate(descs,
                                      RequestFactory.Create(CliOptions.WindowsStyle, new string[0], descs, new MockOutputFactory())));
            Assert.IsFalse(v.Validate(descs,
                                      RequestFactory.Create(CliOptions.WindowsStyle, new[] { "/width:10", "/width:10" }, descs,
                                                            new MockOutputFactory())));
            Assert.IsFalse(v.Validate(descs,
                                      RequestFactory.Create(CliOptions.WindowsStyle, new[] { "10" }, descs, new MockOutputFactory())));
        }
        public void Create()
        {
            List <Description> descs = DescriptionFactory
                                       .Create(
                CliOptions.WindowsStyle, new MockHelpProvider(),
                "/debug /database:STRING /port:int# [/UserName:string] filename [INPUT:int#]"
                );

            Assert.AreEqual(6, descs.Count);

            Assert.AreEqual(eROLE.NAMED, descs[0].Role);
            Assert.AreEqual(eROLE.NAMED, descs[1].Role);
            Assert.AreEqual(eROLE.NAMED, descs[2].Role);
            Assert.AreEqual(eROLE.NAMED, descs[3].Role);
            Assert.AreEqual(eROLE.PASSED, descs[4].Role);
            Assert.AreEqual(eROLE.PASSED, descs[5].Role);

            Assert.AreEqual("debug", descs[0].Name);
            Assert.AreEqual("database", descs[1].Name);
            Assert.AreEqual("port", descs[2].Name);
            Assert.AreEqual("username", descs[3].Name);
            Assert.AreEqual("filename", descs[4].Name);
            Assert.AreEqual("input", descs[5].Name);

            Assert.IsNull(descs[0].Type);
            Assert.IsTrue(descs[1].Type is ParamString);
            Assert.IsTrue(descs[2].Type is ParamInt);
            Assert.IsTrue(descs[3].Type is ParamString);
            Assert.IsTrue(descs[4].Type is ParamString);
            Assert.IsTrue(descs[5].Type is ParamInt);

            Assert.AreEqual(eMULTIPLICITY.ONCE, descs[0].Multiplicity);
            Assert.AreEqual(eMULTIPLICITY.ONCE, descs[1].Multiplicity);
            Assert.AreEqual(eMULTIPLICITY.MULTIPLE, descs[2].Multiplicity);
            Assert.AreEqual(eMULTIPLICITY.ONCE, descs[3].Multiplicity);
            Assert.AreEqual(eMULTIPLICITY.ONCE, descs[4].Multiplicity);
            Assert.AreEqual(eMULTIPLICITY.MULTIPLE, descs[5].Multiplicity);

            Assert.AreEqual(eSCOPE.REQUIRED, descs[0].Scope);
            Assert.AreEqual(eSCOPE.REQUIRED, descs[1].Scope);
            Assert.AreEqual(eSCOPE.REQUIRED, descs[2].Scope);
            Assert.AreEqual(eSCOPE.OPTIONAL, descs[3].Scope);
            Assert.AreEqual(eSCOPE.REQUIRED, descs[4].Scope);
            Assert.AreEqual(eSCOPE.OPTIONAL, descs[5].Scope);
        }
        public void Parse_1()
        {
            string[] invalidStrings =
            {
                "/debug#", "",  "/",     "[]", "[/debug", "/debug]", "/debug:xxxx", "xxx:xxx",
                "[:xxx]",  ":", "23473", "1abc"
            };

            foreach (string invalid in invalidStrings)
            {
                try
                {
                    Description desc = DescriptionFactory.Parse(CliOptions.WindowsStyle, new MockHelpProvider(),
                                                                invalid);
                    Assert.Fail("Expected SyntaxErrorException for {0}", invalid);
                }
                catch (SyntaxErrorException)
                {
                }
            }
        }
示例#12
0
        /// <summary>
        /// The main entry point for the example.
        /// </summary>
        /// <param name="pArgs">The arguments from the command line.</param>
        private static void Main(string[] pArgs)
        {
            WriteGreeting();

            CliOptions options = CliOptions.WindowsStyle;

            List <Description> descs = DescriptionFactory.Create(
                options, new HelpResource(Help.ResourceManager),
                "/echo [/mode:string#] /address:string /database:string /username:string [/password:string] filename [output:string]"
                );

            ConsoleFactory consoleFactory = new ConsoleFactory();

            if (pArgs.Length == 0)
            {
                OutputHelp outputHelp = new OutputHelp(options, consoleFactory.Create());
                outputHelp.Show(descs);
                return;
            }

            Request request = RequestFactory.Create(options, pArgs, descs, consoleFactory);
        }
示例#13
0
        /// <summary>
        /// Entry
        /// </summary>
        /// <param name="pArgs">The arguments from the command line.</param>
        private static void Main(string[] pArgs)
        {
            ConsoleFactory consoleFactory = new ConsoleFactory();
            iOutputStream  outS           = consoleFactory.Create();

            WriteGreeting(outS);

            CliOptions options = CliOptions.WindowsStyle;

            List <Description> descs = DescriptionFactory.Create(
                options, new HelpResource(Help.ResourceManager),
                "[/domains:string] [/limit:int] [/count] [/sort:string] [/desc] [/max:int] [/min:int] pattern"
                );

            if (pArgs.Length == 0)
            {
                OutputHelp outputHelp = new OutputHelp(options, consoleFactory.Create());
                outputHelp.Show(descs);
                return;
            }

            Request req = RequestFactory.Create(options, pArgs, descs, consoleFactory);

            if (!req.Valid)
            {
                return;
            }

            string pattern = req.Get <string>("pattern");

            outS.Standard(pattern);
            outS.Standard("");

            int max = req.Contains("max") ? Math.Min(req.Get <int>("max"), _MAX_LENGTH) :_MAX_LENGTH;
            int min = req.Contains("min") ? Math.Max(req.Get <int>("min"), 1) : 1;

            IEnumerable <string> domains = (from topLevel in getTopLevel(req)
                                            from domain in getPattern(req)
                                            where !domain.StartsWith("-") &&
                                            !domain.EndsWith("-") &&
                                            domain.Length <= max &&
                                            domain.Length >= min
                                            let str = string.Format("{0}.{1}", domain, topLevel)
                                                      where str.Length <= _MAX_LENGTH &&
                                                      !AnyLabelTooLong(domain, 63)
                                                      select str).Distinct();

            if (req.Contains("count"))
            {
                outS.Standard(domains.Count().ToString(CultureInfo.InvariantCulture));
                return;
            }

            if (req.Contains("sort"))
            {
                string sort = req.Get <string>("sort").ToLower();
                domains = sort == "width"
                    ? domains.OrderBy(pDomain => pDomain.Length)
                    : domains.OrderBy(pDomain => pDomain);

                if (req.Contains("desc"))
                {
                    domains = domains.Reverse();
                }
            }

            foreach (string domain in setLimit(req, domains))
            {
                if (isFree(domain))
                {
                    outS.Standard(domain);
                }
            }
        }
        private static void AssertOptional(CliOptions pOptions, string pPattern)
        {
            Description desc = DescriptionFactory.Parse(pOptions, new MockHelpProvider(), pPattern);

            Assert.AreEqual(eSCOPE.OPTIONAL, desc.Scope);
        }