示例#1
0
        public void UnicodeCategoryByFlagPatternGenerationsTest()
        {
            for (RegexUnicodeCategoryFlag flag = RegexUnicodeCategoryFlag.Lo; flag < RegexUnicodeCategoryFlag.Z; flag = (RegexUnicodeCategoryFlag)((int)flag << 1))
            {
                // Arrange
                var expectedPattern = $@"\p{{{flag}}}+";

                var regexGenerator = new RegexGenerator(RegexLanguage.DotNet)
                                     .AddUnicodeCategory(flag, min: 1);

                // Act
                var actualPattern = regexGenerator.ToString();

                // Assert
                Assert.Equal(expectedPattern, actualPattern);
            }
        }
        public void UnicodeCategoryByFlagPatternGenerationsTest()
        {
            for (RegexUnicodeCategoryFlag flag = RegexUnicodeCategoryFlag.Lo; flag < RegexUnicodeCategoryFlag.Z; flag = (RegexUnicodeCategoryFlag)((int)flag << 1))
            {
                // Arrange
                var pattern         = $@"\p{{{flag}}}+";
                var expectedPattern = $"/{pattern}/";

                Assert.Throws <UnicodeCategoryNotSupportedException>(() =>
                {
                    var regexGenerator = new RegexGenerator(RegexLanguage.ECMAScript)
                                         .AddUnicodeCategory(flag, min: 1);

                    // Act
                    var actualPattern = regexGenerator.ToString();

                    // Assert
                    Assert.Equal(expectedPattern, actualPattern);
                });
            }
        }
        /// <summary>
        /// Create and add <see cref="RegexUnicodeCategoryNode"/> to the generator.
        /// <seealso cref="RegexUnicodeCategoryNode(RegexUnicodeCategoryFlag, bool, int?, int?, RegexQuantifierOption)"/>
        /// <seealso cref="AddUnicodeCategory(RegexUnicodeCategoryNode)"/>
        /// </summary>
        /// <param name="unicodeCategory">Value from <see cref="RegexUnicodeCategoryFlag"/>.</param>
        /// <param name="negative">Optional value to determine if negate the category.</param>
        /// <param name="min">Optional minimum number of occurance.</param>
        /// <param name="max">Optional maximum number of occurance.</param>
        /// <param name="quantifierOption">Optional quantifier option.</param>
        /// <returns><see cref="RegexGenerator"/></returns>
        /// <exception cref="UnicodeCategoryNotSupportedException">Unicode category is not supported by <see cref="RegexLanguage"/>.</exception>
        public RegexGenerator AddUnicodeCategory(RegexUnicodeCategoryFlag unicodeCategory, bool negative = false, int?min = null, int?max = null, RegexQuantifierOption quantifierOption = RegexQuantifierOption.Greedy)
        {
            var unicodeCategoryNode = new RegexUnicodeCategoryNode(unicodeCategory, negative, min, max, quantifierOption);

            return(AddUnicodeCategory(unicodeCategoryNode));
        }
 /// <summary>
 /// Initialize an instance of <see cref="RegexUnicodeCategoryNode"/> with flag <see cref="RegexUnicodeCategoryFlag"/>.
 /// <para>Internally call <see cref="Enum.ToString()"/>. Therefore, only use one value from <see cref="RegexUnicodeCategoryFlag"/> while using this constructor;
 /// Use <see cref="RegexUnicodeCategoryNode(string, bool, int?, int?, RegexQuantifierOption)"/> instead for named unicode block.</para>
 /// <seealso cref="RegexUnicodeCategoryNode(string, bool, int?, int?, RegexQuantifierOption)"/>
 /// </summary>
 /// <remarks>
 /// <code>
 /// (RegexUnicodeCategoryFlag.Lu | RegexUnicodeCategoryFlag.Ll).ToString() // will generate "Lu, Ll", which is a invalid form.
 /// </code>
 /// </remarks>
 /// <param name="unicodeCategory">Value from <see cref="RegexUnicodeCategoryFlag"/>.</param>
 /// <param name="negative">Optional value to determine if negate the category.</param>
 /// <param name="min">Optional minimum number of occurance.</param>
 /// <param name="max">Optional maximum number of occurance.</param>
 /// <param name="quantifierOption">Optional quantifier option.</param>
 public RegexUnicodeCategoryNode(RegexUnicodeCategoryFlag unicodeCategory, bool negative = false, int?min = null, int?max = null, RegexQuantifierOption quantifierOption = RegexQuantifierOption.Greedy)
     : base(unicodeCategory.ToString(), min, max, quantifierOption)
 {
     Negative = negative;
 }
示例#5
0
        public void UnicodeCategoryByFlagMatchesTest()
        {
            var textDict = new Dictionary <RegexUnicodeCategoryFlag, string>()
            {
                { RegexUnicodeCategoryFlag.Lu, "A" },      // U+0041
                { RegexUnicodeCategoryFlag.Ll, "a" },      // U+0061
                { RegexUnicodeCategoryFlag.Lt, "Dž" },      // U+01C5
                //{ RegexUnicodeCategoryFlag.LC, "AaDž" },
                { RegexUnicodeCategoryFlag.Lm, "ʰ" },      // U+02B0
                { RegexUnicodeCategoryFlag.Lo, "ƻ" },      // U+01BB
                //{ RegexUnicodeCategoryFlag.L, "AaDžʰƻ" }.
                { RegexUnicodeCategoryFlag.Mn, "\u033A" }, // U+033A
                { RegexUnicodeCategoryFlag.Mc, "\u0903" }, // U+0903
                { RegexUnicodeCategoryFlag.Me, "\u20E0" }, // U+20E0
                //{ RegexUnicodeCategoryFlag.M, "\u033A\U0001D16F\u20E0" },
                { RegexUnicodeCategoryFlag.Nd, "0" },      // U+0030
                { RegexUnicodeCategoryFlag.Nl, "〡" },      // U+3021
                { RegexUnicodeCategoryFlag.No, "¼" },      // U+00BC
                //{ RegexUnicodeCategoryFlag.N, "0〡¼" },
                { RegexUnicodeCategoryFlag.Pc, "_" },      // U+005F
                { RegexUnicodeCategoryFlag.Pd, "-" },      // U+002D
                { RegexUnicodeCategoryFlag.Ps, "(" },      // U+0028
                { RegexUnicodeCategoryFlag.Pe, ")" },      // U+0029
                { RegexUnicodeCategoryFlag.Pi, "«" },      // U+00AB
                { RegexUnicodeCategoryFlag.Pf, "»" },      // U+00BB
                { RegexUnicodeCategoryFlag.Po, "!" },      // U+0021
                //{ RegexUnicodeCategoryFlag.P, "_-()«»!" },
                { RegexUnicodeCategoryFlag.Sm, "+" },      // U+002B
                { RegexUnicodeCategoryFlag.Sc, "$" },      // U+0024
                { RegexUnicodeCategoryFlag.Sk, "^" },      // U+005E
                { RegexUnicodeCategoryFlag.So, "⚡" },      // U+26A1
                //{ RegexUnicodeCategoryFlag.S, "+$^⚡" },
                { RegexUnicodeCategoryFlag.Zs, " " },      // U+0020
                { RegexUnicodeCategoryFlag.Zl, "\u2028" }, // U+2028
                { RegexUnicodeCategoryFlag.Zp, "\u2029" }, // U+2029
                //{ RegexUnicodeCategoryFlag.Z, " \u2028\u2029" },
                { RegexUnicodeCategoryFlag.Cc, "\u0000" }, // U+0000
                { RegexUnicodeCategoryFlag.Cf, "\u00AD" }, // U+00AD
                { RegexUnicodeCategoryFlag.Cs, "\uD800" }, // U+D800
                { RegexUnicodeCategoryFlag.Co, "\uE000" }, // U+E000
                //{ RegexUnicodeCategoryFlag.Cn, "" }, // nothing
                //{ RegexUnicodeCategoryFlag.C, "\u0000\u00AD\uD800\uE000" }
            };

            for (RegexUnicodeCategoryFlag flag = RegexUnicodeCategoryFlag.Lu; flag < RegexUnicodeCategoryFlag.Cn; flag = (RegexUnicodeCategoryFlag)((int)flag << 1))
            {
                // Arrange
                var text          = textDict[flag];
                var regex         = new Regex($@"\p{{{flag}}}+");
                var expectedMatch = regex.Match(text);

                var regexGenerator = new RegexGenerator(RegexLanguage.DotNet)
                                     .AddUnicodeCategory(flag, min: 1);

                // Act
                var generatedRegex = regexGenerator.Create();
                var actualMatch    = generatedRegex.Match(text);

                // Assert
                Assert.True(expectedMatch.Success);
                Assert.True(actualMatch.Success);
                Assert.Equal(expectedMatch.Value, actualMatch.Value);
            }
        }