コード例 #1
0
        public void ParseNestedConcatenatedGroupsCorrectly()
        {
            var expected = new List <IRegularExpression>
            {
                new SingleAtomExpression(new Literal("a", Quantifier.None)),
                new SingleAtomExpression(new Group(new ConcatenatedExpression(new IRegularExpression[] {
                    new SingleAtomExpression(new Literal("f", Quantifier.None)),
                    new SingleAtomExpression(new Literal("o", Quantifier.None)),
                    new SingleAtomExpression(new Literal("o", Quantifier.None)),
                }.ToList()), "(foo)", Quantifier.None)),
                new SingleAtomExpression(new Group(new ConcatenatedExpression(new IRegularExpression[] {
                    new SingleAtomExpression(new Literal("b", Quantifier.None)),
                    new SingleAtomExpression(new Literal("a", Quantifier.None)),
                    new SingleAtomExpression(new Literal("r", Quantifier.None)),
                }.ToList()), "(bar)", Quantifier.None)),
                new SingleAtomExpression(new Literal("b", Quantifier.None))
            };
            var expression = VBRegexParser.Parse("(a(foo)(bar)b)");

            Assert.IsInstanceOf(typeof(SingleAtomExpression), expression);
            Assert.IsInstanceOf(typeof(Group), ((SingleAtomExpression)expression).Atom);
            var containedGroup = (Group)((SingleAtomExpression)expression).Atom;
            var subexpressions = containedGroup.Subexpression.Subexpressions;

            Assert.AreEqual(expected.Count, subexpressions.Count);
            for (var i = 0; i < expected.Count; i++)
            {
                Assert.AreEqual(expected[i], subexpressions[i]);
            }
        }
コード例 #2
0
        public void CharacterClassIsNotAnAlternativesExpression()
        {
            var expression = VBRegexParser.Parse("[a|b]");

            Assert.IsInstanceOf(typeof(SingleAtomExpression), expression);
            Assert.AreEqual(new CharacterClass("[a|b]", Quantifier.None), (expression as SingleAtomExpression).Atom);
        }
コード例 #3
0
        public void ParseCharacterClassAsAtomWorks()
        {
            var pattern    = "[abcd]*";
            var expression = VBRegexParser.Parse(pattern);

            Assert.IsInstanceOf(typeof(SingleAtomExpression), expression);
            Assert.AreEqual(new CharacterClass("[abcd]", new Quantifier("*")), (expression as SingleAtomExpression).Atom);
        }
コード例 #4
0
        public void ParseUnicodeEscapeAsAtomWorks()
        {
            var pattern    = "\\u1234+";
            var expression = VBRegexParser.Parse(pattern);

            Assert.IsInstanceOf(typeof(SingleAtomExpression), expression);
            Assert.AreEqual(new Literal("\\u1234", new Quantifier("+")), (expression as SingleAtomExpression).Atom);
        }
コード例 #5
0
        public void ParseOctalEscapeSequenceAsAtomWorks()
        {
            var pattern    = "\\712{2}";
            var expression = VBRegexParser.Parse(pattern);

            Assert.IsInstanceOf(typeof(SingleAtomExpression), expression);
            Assert.AreEqual(new Literal("\\712", new Quantifier("{2}")), (expression as SingleAtomExpression).Atom);
        }
コード例 #6
0
        public void ParseEscapedLiteralAsAtomWorks()
        {
            var pattern    = "\\)";
            var expression = VBRegexParser.Parse(pattern);

            Assert.IsInstanceOf(typeof(SingleAtomExpression), expression);
            Assert.AreEqual(new Literal("\\)", Quantifier.None), (expression as SingleAtomExpression).Atom);
        }
コード例 #7
0
        public void ParseSingleLiteralGroupAsAtomWorks()
        {
            var pattern    = "(g){2,4}";
            var expression = VBRegexParser.Parse(pattern);

            Assert.IsInstanceOf(typeof(SingleAtomExpression), expression);
            Assert.AreEqual(new Group(new SingleAtomExpression(new Literal("g", Quantifier.None)), "(g)", new Quantifier("{2,4}")), (expression as SingleAtomExpression).Atom);
        }
コード例 #8
0
 public void ParseUnescapedSpecialCharAsAtomFails()
 {
     foreach (var paren in "()[]{}*?+".ToCharArray().Select(c => "" + c))
     {
         var hack       = paren;
         var expression = VBRegexParser.Parse(hack);
         Assert.IsAssignableFrom(typeof(ErrorExpression), expression);
     }
 }
コード例 #9
0
        public void GroupIsNotAnAlternativesExpression()
        {
            var expression = VBRegexParser.Parse("(a|b)");

            Assert.IsInstanceOf(typeof(SingleAtomExpression), expression);
            Assert.AreEqual(new Group(new AlternativesExpression(new IRegularExpression[] {
                new SingleAtomExpression(new Literal("a", Quantifier.None)),
                new SingleAtomExpression(new Literal("b", Quantifier.None)),
            }.ToList()), "(a|b)", Quantifier.None), (expression as SingleAtomExpression).Atom);
        }
コード例 #10
0
        public void CorrectEscapeSequenceIsGroupSubExpression()
        {
            var expression = VBRegexParser.Parse(@"(\\)");

            Assert.IsInstanceOf(typeof(SingleAtomExpression), expression);
            var inner = (((expression as SingleAtomExpression).Atom as Group)?.Subexpression as SingleAtomExpression);

            Assert.IsNotNull(inner);
            Assert.AreEqual(new SingleAtomExpression(new Literal("\\\\", Quantifier.None)), inner);
        }
コード例 #11
0
        // https://github.com/rubberduck-vba/Rubberduck/issues/4839
        public void TrailingEscapedBackslash()
        {
            const string pattern = @"[^\w\\]";

            var expression = VBRegexParser.Parse(pattern);

            Assert.IsInstanceOf(typeof(SingleAtomExpression), expression);
            var atom = (expression as SingleAtomExpression).Atom;

            Assert.AreEqual(new CharacterClass(@"[^\w\\]", Quantifier.None), atom);
        }
コード例 #12
0
        public void IncorrectEscapeSequenceIsGroupSubExpression()
        {
            var expected = new List <IRegularExpression>
            {
                new ErrorExpression("\\"),
                new SingleAtomExpression(new Literal("m", Quantifier.None))
            };
            var expression = VBRegexParser.Parse("(\\m)");

            Assert.IsInstanceOf(typeof(SingleAtomExpression), expression);
            var subexpressions = (((expression as SingleAtomExpression).Atom as Group)?.Subexpression as ConcatenatedExpression)?.Subexpressions ?? new List <IRegularExpression>();

            Assert.AreEqual(expected.Count, subexpressions.Count);
            for (var i = 0; i < expected.Count; i++)
            {
                Assert.AreEqual(expected[i], subexpressions[i]);
            }
        }
コード例 #13
0
        public void UnbalancedGroupCorrectlyMarksTrailingParenAsError()
        {
            var expected = new List <IRegularExpression>()
            {
                new SingleAtomExpression(new Group(new SingleAtomExpression(new Literal("a", Quantifier.None)), "(a)", Quantifier.None)),
                new ErrorExpression(")"),
            };
            var expression = VBRegexParser.Parse("(a))");

            Assert.IsInstanceOf(typeof(ConcatenatedExpression), expression);
            var subexpressions = (expression as ConcatenatedExpression).Subexpressions;

            Assert.AreEqual(expected.Count, subexpressions.Count);
            for (var i = 0; i < expected.Count; i++)
            {
                Assert.AreEqual(expected[i], subexpressions[i]);
            }
        }
コード例 #14
0
        public void ParseGroupConcatenationAsConcatenatedExpression()
        {
            var expected = new List <IRegularExpression>
            {
                new SingleAtomExpression(new Group(new SingleAtomExpression(new Literal("a", Quantifier.None)), "(a)", Quantifier.None)),
                new SingleAtomExpression(new Group(new SingleAtomExpression(new Literal("b", Quantifier.None)), "(b)", Quantifier.None))
            };
            var expression = VBRegexParser.Parse("(a)(b)");

            Assert.IsInstanceOf(typeof(ConcatenatedExpression), expression);
            var subexpressions = (expression as ConcatenatedExpression).Subexpressions;

            Assert.AreEqual(expected.Count, subexpressions.Count);
            for (var i = 0; i < expected.Count; i++)
            {
                Assert.AreEqual(expected[i], subexpressions[i]);
            }
        }
コード例 #15
0
        public void ParseSimplisticAlternativesExpression()
        {
            var expected = new List <IRegularExpression>
            {
                new SingleAtomExpression(new Literal("a", Quantifier.None)),
                new SingleAtomExpression(new Literal("b", Quantifier.None))
            };

            var expression = VBRegexParser.Parse("a|b");

            Assert.IsInstanceOf(typeof(AlternativesExpression), expression);
            var subexpressions = (expression as AlternativesExpression).Subexpressions;

            Assert.AreEqual(expected.Count, subexpressions.Count);
            for (var i = 0; i < expected.Count; i++)
            {
                Assert.AreEqual(expected[i], subexpressions[i]);
            }
        }
コード例 #16
0
        public void ParseSimplisticCharacterClassConcatenationAsConcatenatedExpression()
        {
            var expected = new List <IRegularExpression>
            {
                new SingleAtomExpression(new Literal("a", Quantifier.None)),
                new SingleAtomExpression(new CharacterClass("[abc]", new Quantifier("*"))),
                new SingleAtomExpression(new Literal("b", Quantifier.None))
            };

            var expression = VBRegexParser.Parse("a[abc]*b");

            Assert.IsInstanceOf(typeof(ConcatenatedExpression), expression);
            var subexpressions = (expression as ConcatenatedExpression).Subexpressions;

            Assert.AreEqual(expected.Count, subexpressions.Count);
            for (var i = 0; i < expected.Count; i++)
            {
                Assert.AreEqual(expected[i], subexpressions[i]);
            }
        }
コード例 #17
0
        public void EscapedParensGroupIsParsedProperly()
        {
            var expected = new List <IRegularExpression>()
            {
                new SingleAtomExpression(new Literal("\\(", Quantifier.None)),
                new SingleAtomExpression(new Group(new ConcatenatedExpression(new IRegularExpression[] {
                    new SingleAtomExpression(new Literal("\\(", Quantifier.None)),
                    new SingleAtomExpression(new Literal("\\)", Quantifier.None)),
                }.ToList()), "(\\(\\))", Quantifier.None)),
                new SingleAtomExpression(new Literal("\\)", Quantifier.None)),
            };
            var expression = VBRegexParser.Parse(@"\((\(\))\)");

            Assert.IsInstanceOf(typeof(ConcatenatedExpression), expression);
            var subexpressions = (expression as ConcatenatedExpression).Subexpressions;

            Assert.AreEqual(expected.Count, subexpressions.Count);
            for (var i = 0; i < expected.Count; i++)
            {
                Assert.AreEqual(expected[i], subexpressions[i]);
            }
        }
コード例 #18
0
        public void ParseSimplisticGroupConcatenationAsConcatenatedExpression()
        {
            var expected = new List <IRegularExpression>
            {
                new SingleAtomExpression(new Literal("a", Quantifier.None)),
                new SingleAtomExpression(new Group(new ConcatenatedExpression(new IRegularExpression[] {
                    new SingleAtomExpression(new Literal("a", Quantifier.None)),
                    new SingleAtomExpression(new Literal("b", Quantifier.None)),
                    new SingleAtomExpression(new Literal("c", Quantifier.None)),
                }.ToList()), "(abc)", new Quantifier("{1,4}"))),
                new SingleAtomExpression(new Literal("b", Quantifier.None))
            };

            var expression = VBRegexParser.Parse("a(abc){1,4}b");

            Assert.IsInstanceOf(typeof(ConcatenatedExpression), expression);
            var subexpressions = (expression as ConcatenatedExpression).Subexpressions;

            Assert.AreEqual(expected.Count, subexpressions.Count);
            for (var i = 0; i < expected.Count; i++)
            {
                Assert.AreEqual(expected[i], subexpressions[i]);
            }
        }