Ejemplo n.º 1
0
        private static void CompareGroups(TestPattern pattern, PcreRefMatch actualMatch, ExpectedMatch expectedMatch)
        {
            var expectedGroups = expectedMatch.Groups.ToList();

            Assert.That(actualMatch.Groups.Count, Is.GreaterThanOrEqualTo(expectedGroups.Count));

            for (var groupIndex = 0; groupIndex < actualMatch.Groups.Count; ++groupIndex)
            {
                var actualGroup   = actualMatch.Groups[groupIndex];
                var expectedGroup = groupIndex < expectedGroups.Count
                    ? expectedGroups[groupIndex]
                    : ExpectedGroup.Unset;

                Assert.That(actualGroup.Success, Is.EqualTo(expectedGroup.IsMatch));

                if (expectedGroup.IsMatch)
                {
                    var expectedValue = pattern.SubjectLiteral
                        ? expectedGroup.Value
                        : expectedGroup.Value.UnescapeGroup();

                    Assert.That(actualGroup.Value.ToString(), Is.EqualTo(expectedValue));
                }
            }
        }
Ejemplo n.º 2
0
        protected TestPattern ReadNextPattern()
        {
            while (true)
            {
                var line       = ReadLine();
                var lineNumber = _lineNumber;

                if (line == null)
                {
                    return(null);
                }

                if (String.IsNullOrWhiteSpace(line))
                {
                    continue;
                }

                if (line.StartsWith("#"))
                {
                    continue; // TODO : Interpret that
                }
                line = line.TrimStart();

                if (line[0] <= ' ')
                {
                    throw InvalidInputException("Unexpected input");
                }

                var delimiter = line[0];

                var fullString = new StringBuilder();
                var pattern    = new StringBuilder();

                var firstLine = true;

                while (true)
                {
                    fullString.AppendLine(line);

                    for (var i = 0; i < line.Length; ++i)
                    {
                        if (line[i] == delimiter)
                        {
                            if (firstLine)
                            {
                                firstLine = false;
                            }
                            else
                            {
                                var result = new TestPattern
                                {
                                    FullString    = fullString.ToString(),
                                    Pattern       = pattern.ToString(),
                                    OptionsString = line.Substring(i + 1),
                                    LineNumber    = lineNumber
                                };

                                ParseOptions(result);

                                return(result);
                            }
                        }

                        else if (line[i] == '\\')
                        {
                            pattern.Append('\\');
                            if (++i < line.Length)
                            {
                                pattern.Append(line[i]);
                            }
                        }
                        else
                        {
                            pattern.Append(line[i]);
                        }
                    }

                    pattern.Append('\n');

                    line = ReadLine();

                    if (line == null)
                    {
                        throw InvalidInputException("Unexpected end of pattern");
                    }
                }
            }
        }
Ejemplo n.º 3
0
        private void ParseOptions(TestPattern pattern)
        {
            pattern.PatternOptions  = PcreOptions.None;
            pattern.ResetOptionBits = PcreOptions.None;

            foreach (var part in pattern.OptionsString.Split(','))
            {
                var args = part.Split('=');

                var name  = args[0];
                var value = args.Length == 2 ? args[1] : null;

                switch (name)
                {
                case "aftertext":
                case "allaftertext":
                    pattern.GetRemainingString = true;
                    break;

                case "dupnames":
                    pattern.PatternOptions |= PcreOptions.DuplicateNames;
                    break;

                case "mark":
                    pattern.ExtractMarks = true;
                    break;

                case "no_start_optimize":
                    pattern.PatternOptions |= PcreOptions.NoStartOptimize;
                    break;

                case "hex":
                    pattern.HexEncoding = true;
                    break;

                case "dollar_endonly":
                    pattern.PatternOptions |= PcreOptions.DollarEndOnly;
                    break;

                case "anchored":
                    pattern.PatternOptions |= PcreOptions.Anchored;
                    break;

                case "ungreedy":
                    pattern.PatternOptions |= PcreOptions.Ungreedy;
                    break;

                case "global":
                case "altglobal":
                    pattern.AllMatches = true;
                    break;

                case "no_auto_possess":
                    pattern.PatternOptions |= PcreOptions.NoAutoPossess;
                    break;

                case "no_auto_capture":
                    pattern.PatternOptions |= PcreOptions.ExplicitCapture;
                    break;

                case "auto_callout":
                    pattern.PatternOptions |= PcreOptions.AutoCallout;
                    break;

                case "firstline":
                    pattern.PatternOptions |= PcreOptions.FirstLineOnly;
                    break;

                case "alt_bsux":
                    pattern.PatternOptions |= PcreOptions.AltBsUX;
                    break;

                case "allow_empty_class":
                    pattern.PatternOptions |= PcreOptions.AllowEmptyClass;
                    break;

                case "match_unset_backref":
                    pattern.PatternOptions |= PcreOptions.MatchUnsetBackref;
                    break;

                case "allcaptures":
                    break;

                case "replace":
                    pattern.ReplaceWith = value;
                    break;

                case "info":
                    pattern.IncludeInfo = true;
                    break;

                case "no_dotstar_anchor":
                    pattern.PatternOptions |= PcreOptions.NoDotStarAnchor;
                    break;

                case "dotall":
                    pattern.PatternOptions |= PcreOptions.Singleline;
                    break;

                case "newline":     // TODO
                case "bsr":
                case "startchar":
                case "stackguard":
                case "parens_nest_limit":
                    break;

                default:
                    foreach (var c in part)
                    {
                        switch (c)
                        {
                        case 'i':
                            pattern.PatternOptions |= PcreOptions.IgnoreCase;
                            break;

                        case 'm':
                            pattern.PatternOptions |= PcreOptions.MultiLine;
                            break;

                        case 's':
                            pattern.PatternOptions |= PcreOptions.Singleline;
                            break;

                        case 'x':
                            pattern.PatternOptions |= PcreOptions.IgnorePatternWhitespace;
                            break;

                        case 'g':
                            pattern.AllMatches = true;
                            break;

                        case 'B':
                            break;

                        case 'I':
                            pattern.IncludeInfo = true;
                            break;

                        case '\\':
                            pattern.Pattern += "\\";
                            break;

                        case ' ':
                            break;

                        default:
                            throw InvalidInputException("Unknown option: " + part);
                        }
                    }
                    break;
                }
            }
        }