/// <summary>
        /// append cache for this match provider to MatchCache
        /// </summary>
        /// <returns></returns>
        /// <param name="matchCache"></param>
        public override void AppendDescriptions(ref MatchCache matchCache)
        {
            if (matchCache.SpellCaches.ContainsKey(nameof(InitialsMatchProvider)))
            {
                matchCache.SpellCaches.TryRemove(nameof(InitialsMatchProvider), out _);
            }

            var sp = new SpellCache(GetProviderName(), matchCache.StringLength);

            // set PinYin chart cache
            for (var i = 0; i < matchCache.OriginalString.Length; i++)
            {
                var c = matchCache.OriginalString[i];
                if (i == 0 && c != ' ' ||
                    i > 0 && matchCache.OriginalString[i - 1] == ' ' && c != ' ')
                {
                    sp.Units[i].Add(base.IsCaseSensitive ? c.ToString() : c.ToString().ToLower());
                }
                else
                {
                    sp.SkipFlag[i] = true;
                }
            }
            matchCache.SpellCaches.AddOrUpdate(nameof(InitialsMatchProvider), sp, (key, value) => value);
        }
Example #2
0
 static Caches()
 {
     Account = new AccountCache();
     User    = new UserCache();
     Match   = new MatchCache();
     Fight   = new FightCache();
 }
Example #3
0
        /// <summary>
        /// create a matching spell cache for the string
        /// </summary>
        /// <returns></returns>
        public MatchCache CreateStringCache(string originalString)
        {
            CheckProviders();
            var sd = new MatchCache(originalString);

            foreach (var provider in _providers)
            {
                provider.AppendDescriptions(ref sd);
            }
            return(sd);
        }
        private static bool IsMatch(string message, string regex)
        {
            var key = message.GetHashCode() ^ regex.GetHashCode();

            if (!MatchCache.TryGetValue(key, out var match))
            {
                match           = Regex.IsMatch(message, regex, RegexOptions.IgnoreCase);
                MatchCache[key] = match;
            }
            return(match);
        }
Example #5
0
        /// <summary>
        /// using keywords to match the cache of the original string
        /// </summary>
        /// <param name="matchCache">cache of the original string</param>
        /// <param name="keywords">list of keywords</param>
        /// <returns></returns>
        public MatchResult Match(MatchCache matchCache, IEnumerable <string> keywords)
        {
            CheckProviders();
            var result = MatchResult.CreateUnmatchedResult(matchCache.OriginalString, keywords, IsCaseSensitive);

            foreach (var r in _providers.Select(provider => provider.DoMatches(matchCache, keywords)))
            {
                result.Merge(r);
            }
            return(result);
        }
        protected override MatchResult DoFindMatches(MatchCache matchCache, IEnumerable <string> keywords, IEnumerable <string> keywordsInTrueCase)
        {
            if (!matchCache.SpellCaches.ContainsKey(nameof(JapaneseRomajiProvider)))
            {
                AppendDescriptions(ref matchCache);
            }

            Debug.Assert(!string.IsNullOrEmpty(matchCache.OriginalString));

            if (matchCache.SpellCaches[nameof(JapaneseRomajiProvider)] is SpellCache4JapaneseRomaji spell)
            {
                if (string.IsNullOrEmpty(spell.SpellString) || spell.ConvertFlag.All(x => x == false))
                {
                    return(MatchResult.CreateUnmatchedResult(matchCache.OriginalString, keywords, IsCaseSensitive));
                }

                var keywordList = keywordsInTrueCase?.ToList();
                Debug.Assert(keywordList?.Any() == true);

                var orgStringInTrueCase  = spell.SpellString;
                var spellHitFlags        = CreateBoolFlags(orgStringInTrueCase.Length);
                var keywordsMatchedFlags = CreateBoolFlags(keywordList.Count());

                for (var i = 0; i < keywordList.Count; i++)
                {
                    var keyword = keywordList[i];
                    keywordsMatchedFlags[i] = DoMatch(orgStringInTrueCase, spell.BeginFlags, keyword, ref spellHitFlags);
                }

                // gent hit flag
                var hitFlags = CreateBoolFlags(matchCache.StringLength);
                for (int i = 0; i < spellHitFlags.Count; i++)
                {
                    if (spellHitFlags[i])
                    {
                        for (int j = 0; j < spell.SpellCharToOrgIndexes[i].Count; j++)
                        {
                            hitFlags[spell.SpellCharToOrgIndexes[i][j]] = true;
                        }
                    }
                }

                var ret = new MatchResult(matchCache.OriginalString, keywords, base.IsCaseSensitive, keywordsMatchedFlags, hitFlags);
                return(ret);
            }
            else
            {
                throw new Exception(
                          $"{nameof(ISpellCache)} Type error, should be {nameof(SpellCache4JapaneseRomaji)}, but now is {matchCache.SpellCaches[nameof(JapaneseRomajiProvider)].GetType().Name}");
            }
        }
        public bool CanHandle(string source, DiaryMode mode)
        {
            if (!Supports(mode))
                return false;

            foreach (var regex in regexes) {
                var match = regex.Match(source);
                if (match.Success) {
                    cached = new MatchCache(source, match);
                    return true;
                }
            }

            return false;
        }
Example #8
0
 /// <summary>
 /// Delete an estate object.
 /// </summary>
 /// <param name="key">Key of object to delete.</param>
 /// <returns>True if object was successfully deleted.</returns>
 public static bool DeleteObject(int key)
 {
     if (DealCache.ContainsKey(key))
     {
         return false;
     }
     OrderCache.Query (new SqlFieldsQuery
         ($"delete from Orders where ObjectID={key};"));
     BookmarkCache.Query (new SqlFieldsQuery
         ($"delete from Bookmarks where ObjectID={key};"));
     MatchCache.Query (new SqlFieldsQuery
         ($"delete from Matches where ObjectID={key};"));
     ObjectCache.Remove(key);
     return true;
 }
Example #9
0
        /// <summary>
        /// append cache for this match provider to MatchCache
        /// </summary>
        /// <returns></returns>
        public override void AppendDescriptions(ref MatchCache matchCache)
        {
            var sp = new SpellCache(GetProviderName(), matchCache.StringLength);

            // set PinYin chart cache
            for (var i = 0; i < matchCache.OriginalString.Length; i++)
            {
                var tmp = ToolGood.Words.Pinyin.WordsHelper.GetAllPinyin(matchCache.OriginalString[i]);
                if (tmp?.Any() == true)
                {
                    foreach (var t in tmp)
                    {
                        // PinYin ignore case
                        sp.Units[i].Add(t.ToLower());
                    }
                    sp.ConvertFlag[i] = true;
                }
                else
                {
                    sp.ConvertFlag[i] = false;
                }
            }

            // no Chinese character.
            if (sp.Units.All(x => x.Count == 0))
            {
                matchCache.SpellCaches.AddOrUpdate(nameof(ChineseZhCnPinYinMatchProvider), new SpellCache(GetProviderName(), matchCache.StringLength), (key, value) => value);
                return;
            }

            // set original char cache
            for (var i = 0; i < matchCache.OriginalString.Length; i++)
            {
                if (sp.Units[i].Count == 0)
                {
                    var c = matchCache.OriginalString[i];
                    // PinYin ignore case
                    sp.Units[i].Add(base.IsCaseSensitive ? c.ToString() : c.ToString().ToLower());
                }
            }

            matchCache.SpellCaches.AddOrUpdate(nameof(ChineseZhCnPinYinMatchProvider), sp, (key, value) => value);
        }
        protected override MatchResult DoFindMatches(MatchCache matchCache, IEnumerable <string> keywords, IEnumerable <string> keywordsInTrueCase)
        {
            Debug.Assert(!string.IsNullOrEmpty(matchCache.OriginalString));
            var keywordList = keywordsInTrueCase?.ToList();

            Debug.Assert(keywordList?.Any() == true);

            var orgStringInTrueCase  = ConvertStringToTrueCase(matchCache.OriginalString, base.IsCaseSensitive);
            var hitFlags             = CreateBoolFlags(matchCache.StringLength);
            var keywordsMatchedFlags = CreateBoolFlags(keywordList.Count());

            for (var i = 0; i < keywordList.Count; i++)
            {
                var keyword = keywordList[i];
                keywordsMatchedFlags[i] = DoMatch(orgStringInTrueCase, keyword, ref hitFlags);
            }

            var ret = new MatchResult(matchCache.OriginalString, keywords, base.IsCaseSensitive, keywordsMatchedFlags, hitFlags);

            return(ret);
        }
        /// <summary>
        /// using keywords to match the cache of the original sting
        /// </summary>
        /// <param name="matchCache">cache of the original sting</param>
        /// <param name="keywords">list of keywords</param>
        /// <returns></returns>
        public MatchResult DoMatches(MatchCache matchCache, IEnumerable <string> keywords)
        {
            if (string.IsNullOrEmpty(matchCache?.OriginalString))
            {
                return(MatchResult.CreateUnmatchedResult(matchCache.OriginalString, keywords, IsCaseSensitive));
            }
            var keywordsInTrueCase = keywords.Distinct().Where(x => !string.IsNullOrEmpty(x)).ToList();

            if (keywordsInTrueCase?.Any() != true)
            {
                return(MatchResult.CreateUnmatchedResult(matchCache.OriginalString, keywords, IsCaseSensitive));
            }

            if (IsCaseSensitive == false)
            {
                for (var i = 0; i < keywordsInTrueCase.Count; i++)
                {
                    keywordsInTrueCase[i] = keywordsInTrueCase[i].ToLower();
                }
            }
            return(DoFindMatches(matchCache, keywords, keywordsInTrueCase));
        }
        protected override MatchResult DoFindMatches(MatchCache matchCache, IEnumerable <string> keywords, IEnumerable <string> keywordsInTrueCase)
        {
            if (!matchCache.SpellCaches.ContainsKey(nameof(InitialsMatchProvider)))
            {
                AppendDescriptions(ref matchCache);
            }

            if (matchCache.SpellCaches[nameof(InitialsMatchProvider)] is SpellCache spell)
            {
                if (spell.Units.Count == 0 || spell.SkipFlag.All(x => x))
                {
                    return(MatchResult.CreateUnmatchedResult(matchCache.OriginalString, keywords, IsCaseSensitive));
                }

                Debug.Assert(!string.IsNullOrEmpty(matchCache.OriginalString));
                var keywordList = keywordsInTrueCase?.ToList();
                Debug.Assert(keywordList?.Any() == true);

                var orgStringInTrueCase  = ConvertStringToTrueCase(matchCache.OriginalString, base.IsCaseSensitive);
                var hitFlags             = CreateBoolFlags(matchCache.StringLength);
                var keywordsMatchedFlags = CreateBoolFlags(keywordList.Count());

                for (var i = 0; i < keywordList.Count; i++)
                {
                    var keyword = keywordList[i];
                    keywordsMatchedFlags[i] = DoMatch(orgStringInTrueCase, spell, keyword, ref hitFlags);
                }

                var ret = new MatchResult(matchCache.OriginalString, keywords, base.IsCaseSensitive,
                                          keywordsMatchedFlags, hitFlags);
                return(ret);
            }
            else
            {
                throw new Exception(
                          $"{typeof(ISpellCache).Name} Type error, should be {typeof(SpellCache).Name}, but now is {matchCache.SpellCaches[nameof(InitialsMatchProvider)].GetType().Name}");
            }
        }
Example #13
0
        /// <summary>
        /// Put match entity into the cache. <br/>
        /// Referential integrity check is done on: <br/>
        /// Match.WishID - ClientWish.key <br/>
        /// Match.ObjectID - Object.key <br/>
        /// </summary>
        /// <param name="value">Match to put into the cache.</param>
        public static void PutMatch (Match value)
        {
            using (var tx = Client.GetTransactions().TxStart())
            {
                // Error if ClientWish with key = value.WishID is not found.
                if (!(ClientWishCache.ContainsKey(value.WishID)))
                {
                    tx.Commit();
                    throw new ReferentialException ("Can not put new entry into Match cache.")
                    {
                        Operation = "put",
                        TableName = "Match",
                        FieldName = "WishID",
                        ReadableMessage = $"Can not put new entry into Match cache because ClientWish with key {value.WishID} does not exist."
                    };
                }

                // Error if EstateObject with key = value.ObjectID is not found.
                if (!(ObjectCache.ContainsKey(value.ObjectID)))
                {
                    tx.Commit();
                    throw new ReferentialException ("Can not put new entry into Match cache.")
                    {
                        Operation = "put",
                        TableName = "Match",
                        FieldName = "ObjectID",
                        ReadableMessage = $"Can not put new entry into Match cache because EstateObject with key {value.ObjectID} does not exist."
                    };
                }
                
                // Normal operation
                long key = (((long)value.WishID)<<32) + value.ObjectID;
                MatchCache.Put (key, value);
                tx.Commit();
            }
        }
        public void FindMatchesTest()
        {
            var matcher = new InitialsMatchProvider(false);
            var dspen   = matcher.GetProviderDescriptionEn();
            var dsp     = matcher.GetProviderDescription();

            Assert.IsTrue(matcher.GetProviderName() == nameof(InitialsMatchProvider));

            {
                var ret = matcher.DoMatches(new MatchCache(""), new[] { "" });
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                string org = "   ";
                var    str = new MatchCache(org);
                matcher.AppendDescriptions(ref str);
                Assert.IsTrue(str.SpellCaches[matcher.GetProviderName()].GetProviderName() == matcher.GetProviderName());
                matcher.DoMatches(str, new[] { " " });
                Assert.IsTrue(
                    str.SpellCaches[nameof(InitialsMatchProvider)] is SpellCache sc &&
                    sc.SkipFlag.All(x => x));
            }

            {
                string org = "abcdefg";
                var    str = new MatchCache(org);
                matcher.AppendDescriptions(ref str);
                matcher.AppendDescriptions(ref str);
            }

            {
                string org = "abcdefg";
                var    kws = new[] { "a" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(ret.Keywords.Count == 1 && ret.Keywords[0] == "a");
                Assert.IsTrue(m.Count == org.Length && m[0] == true && m[1] == false);
            }

            {
                string org = "abcdefg";
                var    kws = new[] { "A" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(ret.Keywords.Count == 1 && ret.Keywords[0] == "A");
                Assert.IsTrue(m.Count == org.Length && m[0] == true && m[1] == false);
            }

            {
                string org = "abaa a";
                var    kws = new[] { " " };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                string org = "abAAa";
                var    kws = new[] { "aa" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                string org = "abAA A";
                var    kws = new[] { "aa" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.Length &&
                              m[0] == true &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true);
            }

            {
                string org = "abAA A";
                var    kws = new[] { "Aa" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.Length &&
                              m[0] == true &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true);
            }

            {
                string org = "a b c d e";
                var    kws = new[] { "ab", "cd" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.Length &&
                              m[0] == true &&
                              m[1] == false &&
                              m[2] == true &&
                              m[3] == false &&
                              m[4] == true &&
                              m[5] == false &&
                              m[6] == true &&
                              m[7] == false &&
                              m[8] == false);
            }

            {
                string org = "a BC de";
                var    kws = new[] { "ab", "cd" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                string org = "a BC de";
                var    kws = new[] { "ab", "bc" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                string org = "a Bc dE ";
                var    kws = new[] { "abd" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.Length &&
                              m[0] == true &&
                              m[1] == false &&
                              m[2] == true &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true &&
                              m[6] == false &&
                              m[7] == false);
            }


            {
                string org = "a Bc dE ";
                var    kws = new[] { "AB", "bd" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.Length &&
                              m[0] == true &&
                              m[1] == false &&
                              m[2] == true &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true &&
                              m[6] == false &&
                              m[7] == false);
            }
        }
        public void FindMatchesTestCase()
        {
            var matcher = new InitialsMatchProvider(true);
            var dspen   = matcher.GetProviderDescriptionEn();
            var dsp     = matcher.GetProviderDescription();


            {
                string org = "abcdefg";
                var    str = new MatchCache(org);
                matcher.AppendDescriptions(ref str);
            }

            {
                string org = "abcdefg";
                var    kws = new[] { "a" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(ret.Keywords.Count == 1 && ret.Keywords[0] == "a");
                Assert.IsTrue(m.Count == org.Length && m[0] == true && m[1] == false);
            }

            {
                string org = "abcdefg";
                var    kws = new[] { "A" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                string org = "abaa a";
                var    kws = new[] { " " };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                string org = "abAAa";
                var    kws = new[] { "aa" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                string org = "abAA A";
                var    kws = new[] { "Aa" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
            }

            {
                string org = "abAA A";
                var    kws = new[] { "aA" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.Length &&
                              m[0] == true &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true);
            }

            {
                string org = "a b c d e";
                var    kws = new[] { "ab", "cd" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.Length &&
                              m[0] == true &&
                              m[1] == false &&
                              m[2] == true &&
                              m[3] == false &&
                              m[4] == true &&
                              m[5] == false &&
                              m[6] == true &&
                              m[7] == false &&
                              m[8] == false);
            }

            {
                string org = "a BC de";
                var    kws = new[] { "ab", "cd" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                string org = "a BC de";
                var    kws = new[] { "ab", "bc" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                string org = "a Bc dE ";
                var    kws = new[] { "abd" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                string org = "a Bc dE ";
                var    kws = new[] { "aBd" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.Length &&
                              m[0] == true &&
                              m[1] == false &&
                              m[2] == true &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true &&
                              m[6] == false &&
                              m[7] == false);
            }

            {
                string org = "a Bc dE ";
                var    kws = new[] { "AB", "bd" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                string org = "a Bc dE ";
                var    kws = new[] { "aB", "Bd" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.Length &&
                              m[0] == true &&
                              m[1] == false &&
                              m[2] == true &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true &&
                              m[6] == false &&
                              m[7] == false);
            }



            {
                string org = "a Bc dE ";
                var    kws = new[] { "aB", "Bd", "K" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.Length &&
                              m[0] == true &&
                              m[1] == false &&
                              m[2] == true &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true &&
                              m[6] == false &&
                              m[7] == false);
            }
        }
 /// <summary>
 /// append cache for this match provider to MatchCache
 /// </summary>
 /// <returns></returns>
 public override void AppendDescriptions(ref MatchCache matchCache)
 {
     // do nothing
 }
        public override void AppendDescriptions(ref MatchCache matchCache)
        {
            var ps = GetRomaji(matchCache.OriginalString);

            if (ps?.Count == 0)
            {
                matchCache.SpellCaches.AddOrUpdate(nameof(JapaneseRomajiProvider), new SpellCache4JapaneseRomaji(GetName(), "", new List <List <int> >(), new List <bool>()
                {
                    false
                }, new List <bool>()
                {
                    false
                }), (key, value) => value);
                return;
            }

            int i           = 0;
            var indexes     = new List <List <int> >();
            var convertFlag = new List <bool>();
            var beginFlag   = new List <bool>();
            var sb          = new StringBuilder();

            foreach (var division in ps)
            {
                var orgElement = "";
                foreach (var d in division)
                {
                    orgElement += d.Element;
                }
                i = matchCache.OriginalString.IndexOf(orgElement, i, StringComparison.Ordinal);
                Debug.Assert(i >= 0);


                if (string.IsNullOrEmpty(division.RomaReading) || division.RomaReading == orgElement)
                {
                    for (var j = 0; j < orgElement.Length; j++)
                    {
                        var c = orgElement[j];
                        sb.Append(base.IsCaseSensitive ? c.ToString() : c.ToString().ToLower());
                        convertFlag.Add(false);
                        beginFlag.Add(true);
                        indexes.Add(new List <int>()
                        {
                            i + j
                        });
                        Debug.Assert(sb.Length == indexes.Count);
                        Debug.Assert(sb.Length == convertFlag.Count);
                    }
                }
                else
                {
                    var ls = new List <int>();
                    for (var j = 0; j < orgElement.Length; j++)
                    {
                        ls.Add(i + j);
                    }

                    foreach (var c in division.RomaReading)
                    {
                        sb.Append(c.ToString().ToLower());
                        beginFlag.Add(false);
                        convertFlag.Add(true);
                        indexes.Add(ls);
                        Debug.Assert(sb.Length == indexes.Count);
                        Debug.Assert(sb.Length == convertFlag.Count);
                    }
                    beginFlag[beginFlag.Count - division.RomaReading.Length] = true;
                }

                i += orgElement.Length;
                Debug.Assert(i <= matchCache.StringLength);
            }

            Debug.Assert(i == matchCache.StringLength);
            Debug.Assert(sb.Length == indexes.Count);
            Debug.Assert(sb.Length == convertFlag.Count);
            Debug.Assert(sb.Length == beginFlag.Count);
            var sp = new SpellCache4JapaneseRomaji(GetName(), sb.ToString(), indexes, convertFlag, beginFlag);

            matchCache.SpellCaches.AddOrUpdate(nameof(JapaneseRomajiProvider), sp, (key, value) => value);
        }
        public void FindMatchesTestCase()
        {
            var matcherCase = new ChineseZhCnPinYinInitialsMatchProvider(true);
            var dspen       = matcherCase.GetProviderDescriptionEn();
            var dsp         = matcherCase.GetProviderDescription();

            {
                var ret = matcherCase.DoMatches(new MatchCache(""), new[] { "" });
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }


            {
                var ret = matcherCase.DoMatches(new MatchCache("a"), new[] { "" });
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                string org = "abcdefg";
                var    kws = new[] { "a" };
                var    ret = matcherCase.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.Keywords.Count == 1 && ret.Keywords[0] == "a");
                Assert.IsTrue(ret.IsMatchAllKeywords == false); // false by no Chinese char
            }

            {
                string org = "abcdefg";
                var    kws = new[] { "A" };
                var    ret = matcherCase.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.Keywords.Count == 1 && ret.Keywords[0] == "A");
                Assert.IsTrue(ret.IsMatchAllKeywords == false); // false by no Chinese char
            }

            var test = new MatchCache("多重多次,行中Ab, ");

            matcherCase.AppendDescriptions(ref test);

            {
                var kws = new[] { "DZ" };
                var ret = matcherCase.DoMatches(new MatchCache("多重多次,行中Ab, "), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == test.StringLength &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == false &&
                              m[8] == false &&
                              m[9] == false &&
                              m[10] == false);
            }

            {
                var kws = new[] { "DC" };
                matcherCase.AppendDescriptions(ref test);
                var ret = matcherCase.DoMatches(test, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == test.StringLength &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == true &&
                              m[3] == true &&
                              m[4] == false &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == false &&
                              m[8] == false &&
                              m[9] == false &&
                              m[10] == false);
            }

            {
                var kws = new[] { "Dz", "HZ" };
                var ret = matcherCase.DoMatches(test, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == test.StringLength &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true &&
                              m[6] == true &&
                              m[7] == false &&
                              m[8] == false &&
                              m[9] == false &&
                              m[10] == false);
            }

            {
                var kws = new[] { "XZA" };
                var ret = matcherCase.DoMatches(test, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == test.StringLength &&
                              m[0] == false &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true &&
                              m[6] == true &&
                              m[7] == true &&
                              m[8] == false &&
                              m[9] == false &&
                              m[10] == false);
            }

            {
                var kws = new[] { "XZAb" };
                var ret = matcherCase.DoMatches(test, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == test.StringLength &&
                              m[0] == false &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true &&
                              m[6] == true &&
                              m[7] == true &&
                              m[8] == true &&
                              m[9] == false &&
                              m[10] == false);
            }

            {
                var kws = new[] { "XZab" };
                var ret = matcherCase.DoMatches(test, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                var kws = new[] { "aB", "," };
                var ret = matcherCase.DoMatches(test, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }



            {
                var kws = new[] { ",", ", " };
                var ret = matcherCase.DoMatches(test, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == test.StringLength &&
                              m[0] == false &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == true &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == false &&
                              m[8] == false &&
                              m[9] == true &&
                              m[10] == true);
            }


            {
                var ret = matcherCase.DoMatches(new MatchCache("大夫A"), new[] { "DF", "B" });
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == 3 &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == false);
            }
        }
        public void FindMatchesTest()
        {
            var matcher = new ChineseZhCnPinYinInitialsMatchProvider(false);
            var dspen   = matcher.GetProviderDescriptionEn();
            var dsp     = matcher.GetProviderDescription();

            Assert.IsTrue(matcher.GetProviderName() == nameof(ChineseZhCnPinYinInitialsMatchProvider));

            {
                var ret = matcher.DoMatches(new MatchCache(""), new[] { "" });
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }


            {
                var ret = matcher.DoMatches(new MatchCache("a"), new[] { "" });
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }


            {
                var kws = new[] { "a" };
                var sd  = new MatchCache("abcdefg");
                matcher.AppendDescriptions(ref sd);
                // no Chinese
                Assert.IsTrue(
                    sd.SpellCaches[nameof(ChineseZhCnPinYinInitialsMatchProvider)] is SpellCache sc &&
                    sc.Units.All(x => x.Count == 0));
                var ret = matcher.DoMatches(sd, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                string org = "abcdefg";
                var    kws = new[] { "a" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false); // false by no Chinese char
                Assert.IsTrue(ret.Keywords.Count == 1 && ret.Keywords[0] == "a");
            }

            {
                string org = "abcdefg";
                var    kws = new[] { "A" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false); // false by no Chinese char
                Assert.IsTrue(ret.Keywords.Count == 1 && ret.Keywords[0] == "A");
            }

            var test = new MatchCache("多重多次,行中Ab, ");

            matcher.AppendDescriptions(ref test);
            Assert.IsTrue(test.SpellCaches[matcher.GetProviderName()].GetProviderName() == matcher.GetProviderName());


            {
                var ret = matcher.DoMatches(new MatchCache("大夫"), new[] { "df" });
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                Assert.IsTrue(ret.HitFlags.All(x => x));
            }

            {
                var ret = matcher.DoMatches(new MatchCache("大夫"), new[] { "tf" });
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                Assert.IsTrue(ret.HitFlags.All(x => x));
            }

            {
                var kws = new[] { "DZ" };
                var ret = matcher.DoMatches(new MatchCache("多重多次,行中Ab, "), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == test.StringLength &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == false &&
                              m[8] == false &&
                              m[9] == false &&
                              m[10] == false);
            }

            {
                var kws = new[] { "DC" };
                matcher.AppendDescriptions(ref test);
                var ret = matcher.DoMatches(test, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == test.StringLength &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == true &&
                              m[3] == true &&
                              m[4] == false &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == false &&
                              m[8] == false &&
                              m[9] == false &&
                              m[10] == false);
            }

            {
                var kws = new[] { "Dz", "HZ" };
                var ret = matcher.DoMatches(test, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == test.StringLength &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true &&
                              m[6] == true &&
                              m[7] == false &&
                              m[8] == false &&
                              m[9] == false &&
                              m[10] == false);
            }

            {
                var kws = new[] { "XZA" };
                var ret = matcher.DoMatches(test, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == test.StringLength &&
                              m[0] == false &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true &&
                              m[6] == true &&
                              m[7] == true &&
                              m[8] == false &&
                              m[9] == false &&
                              m[10] == false);
            }

            {
                var kws = new[] { "XZAb" };
                var ret = matcher.DoMatches(test, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == test.StringLength &&
                              m[0] == false &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true &&
                              m[6] == true &&
                              m[7] == true &&
                              m[8] == true &&
                              m[9] == false &&
                              m[10] == false);
            }

            {
                var kws = new[] { "aB", "," };
                var ret = matcher.DoMatches(test, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == test.StringLength &&
                              m[0] == false &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == true &&
                              m[8] == true &&
                              m[9] == true &&
                              m[10] == false);
            }



            {
                var kws = new[] { ",", ", " };
                var ret = matcher.DoMatches(test, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == test.StringLength &&
                              m[0] == false &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == true &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == false &&
                              m[8] == false &&
                              m[9] == true &&
                              m[10] == true);
            }
        }
        public void DoMatchesTest()
        {
            var matcher1 = new DirectMatchProvider(false);
            var matcher2 = new ChineseZhCnPinYinInitialsMatchProvider(false);
            var test     = new MatchCache("多重hello world");

            matcher1.AppendDescriptions(ref test);
            matcher2.AppendDescriptions(ref test);

            {
                bool throwException = false;
                try
                {
                    var ret = matcher1.DoMatches(new MatchCache("123"), new List <string>()
                    {
                        "dc"
                    });
                    var ret2 = matcher1.DoMatches(new MatchCache("abc"), new List <string>()
                    {
                        "dc"
                    });
                    ret.Merge(ret2);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    throwException = true;
                }

                Assert.IsTrue(throwException);
            }

            {
                var ret = matcher1.DoMatches(test, new List <string>()
                {
                    "dc"
                });
                var ret2 = matcher2.DoMatches(test, new List <string>()
                {
                    "dc"
                });
                ret.Merge(ret2);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                Assert.IsTrue(ret.Keywords.Count == 1 && ret.Keywords[0] == "dc");
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == test.StringLength &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == false &&
                              m[8] == false &&
                              m[9] == false &&
                              m[10] == false &&
                              m[11] == false &&
                              m[12] == false);
            }

            {
                var kws = new List <string>()
                {
                    "dc"
                };
                var ret  = matcher1.DoMatches(test, kws);
                var ret2 = matcher2.DoMatches(test, kws);
                ret.Merge(ret2);
                Assert.IsTrue(ret.Keywords.Count == 1 && ret.Keywords[0] == "dc");
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == test.StringLength &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == false &&
                              m[8] == false &&
                              m[9] == false &&
                              m[10] == false &&
                              m[11] == false &&
                              m[12] == false);
            }


            {
                var ret = matcher1.DoMatches(test, new List <string>()
                {
                    "wor"
                });
                var ret2 = matcher2.DoMatches(test, new List <string>()
                {
                    "Dc"
                });
                ret.Merge(ret2);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(ret.Keywords.Count == 2 && ret.Keywords.Any(x => x == "Dc") && ret.Keywords.Any(x => x == "wor"));
                Assert.IsTrue(m.Count == test.StringLength &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == false &&
                              m[8] == true &&
                              m[9] == true &&
                              m[10] == true &&
                              m[11] == false &&
                              m[12] == false);
            }

            {
                var ret = matcher2.DoMatches(test, new List <string>()
                {
                    "dc"
                });
                ret.Merge(matcher1.DoMatches(test, new List <string>()
                {
                    "wor", "abs"
                }));
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
                Assert.IsTrue(ret.Keywords.Count == 3);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == test.StringLength &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == false &&
                              m[8] == true &&
                              m[9] == true &&
                              m[10] == true &&
                              m[11] == false &&
                              m[12] == false);
            }
        }
Example #21
0
 public bool CanHandle(string source, DiaryMode mode)
 {
     var match = regex.Match(source);
     cached = new MatchCache(source, match);
     return match.Success;
 }
Example #22
0
 /// <summary>
 /// using keywords to match the cache of the original string
 /// </summary>
 /// <param name="matchCache">cache of the original string</param>
 /// <param name="keyword">single keyword</param>
 /// <returns></returns>
 public MatchResult Match(MatchCache matchCache, string keyword)
 {
     return(Match(matchCache, new[] { keyword }));
 }
Example #23
0
        public void FindMatchesTest()
        {
            var matcher     = new ChineseZhCnPinYinMatchProvider(false);
            var matcherCase = new ChineseZhCnPinYinMatchProvider(true);
            var dspen       = matcher.GetProviderDescriptionEn();
            var dsp         = matcher.GetProviderDescription();

            Assert.IsTrue(matcher.GetProviderName() == nameof(ChineseZhCnPinYinMatchProvider));

            {
                var ret = matcher.DoMatches(new MatchCache(""), new[] { "" });
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }


            {
                var ret = matcher.DoMatches(new MatchCache("a"), new[] { "" });
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                string org = "abcdefg";
                var    kws = new[] { "a" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false); // false by no Chinese char
                Assert.IsTrue(ret.Keywords.Count == 1 && ret.Keywords[0] == "a");
            }

            {
                string org = "abcdefg";
                var    kws = new[] { "A" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false); // false by no Chinese char
                Assert.IsTrue(ret.Keywords.Count == 1 && ret.Keywords[0] == "A");
            }

            {
                string org = "abcdefg";
                var    kws = new[] { "a" };
                var    ret = matcherCase.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.Keywords.Count == 1 && ret.Keywords[0] == "a");
                Assert.IsTrue(ret.IsMatchAllKeywords == false); // false by no Chinese char
            }

            {
                string org = "abcdefg";
                var    kws = new[] { "A" };
                var    ret = matcherCase.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.Keywords.Count == 1 && ret.Keywords[0] == "A");
                Assert.IsTrue(ret.IsMatchAllKeywords == false); // false by no Chinese char
            }

            {
                var ret = matcher.DoMatches(new MatchCache("大夫"), new[] { "Daif" });
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                Assert.IsTrue(ret.HitFlags.All(x => x));
            }

            {
                var ret = matcher.DoMatches(new MatchCache("大夫"), new[] { "Daf" });
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                Assert.IsTrue(ret.HitFlags.All(x => x));
            }

            {
                var ret = matcher.DoMatches(new MatchCache("大夫A"), new[] { "DaifUa" });
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                Assert.IsTrue(ret.HitFlags.All(x => x));
            }

            {
                var ret = matcher.DoMatches(new MatchCache("大夫B"), new[] { "Dafb" });
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                var ret = matcher.DoMatches(new MatchCache("大夫C"), new[] { "DaifUa" });
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                var sd = new MatchCache("这东西重量有多重?");
                matcher.AppendDescriptions(ref sd);
                Assert.IsTrue(sd.SpellCaches[matcher.GetProviderName()].GetProviderName() == matcher.GetProviderName());
            }

            {
                var kws = new[] { "a" };
                var sd  = new MatchCache("abcdefg");
                matcher.AppendDescriptions(ref sd);
                // no Chinese
                Assert.IsTrue(
                    sd.SpellCaches[nameof(ChineseZhCnPinYinMatchProvider)] is SpellCache sc &&
                    sc.Units.All(x => x.Count == 0));
                var ret = matcher.DoMatches(sd, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            var testNoCase = new MatchCache("多重多次,行中Ab, ");

            matcher.AppendDescriptions(ref testNoCase);

            {
                var kws = new[] { "A" };
                var ret = matcher.DoMatches(new MatchCache("啊a"), kws);
                var m   = ret.HitFlags;
                Assert.IsTrue(m[0] == true &&
                              m[1] == true);
            }
            {
                var kws = new[] { "a" };
                var ret = matcher.DoMatches(new MatchCache("啊a"), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m[0] == true &&
                              m[1] == true);
            }
            {
                var kws = new[] { "DUOC" };
                var ret = matcher.DoMatches(new MatchCache(testNoCase.OriginalString), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == testNoCase.StringLength &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == true &&
                              m[3] == true &&
                              m[4] == false &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == false &&
                              m[8] == false &&
                              m[9] == false &&
                              m[10] == false);
            }

            {
                var kws = new[] { "DUOCHONG" };
                matcher.AppendDescriptions(ref testNoCase);
                var ret = matcher.DoMatches(testNoCase, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == testNoCase.StringLength &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == false &&
                              m[8] == false &&
                              m[9] == false &&
                              m[10] == false);
            }

            {
                var kws = new[] { "DUOZHONG", "Hangzhong" };
                var ret = matcher.DoMatches(testNoCase, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == testNoCase.StringLength &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true &&
                              m[6] == true &&
                              m[7] == false &&
                              m[8] == false &&
                              m[9] == false &&
                              m[10] == false);
            }

            {
                var kws = new[] { "XingZhongA" };
                var ret = matcher.DoMatches(testNoCase, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == testNoCase.StringLength &&
                              m[0] == false &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true &&
                              m[6] == true &&
                              m[7] == true &&
                              m[8] == false &&
                              m[9] == false &&
                              m[10] == false);
            }

            {
                var kws = new[] { "XingZhonga" };
                var ret = matcher.DoMatches(testNoCase, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == testNoCase.StringLength &&
                              m[0] == false &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true &&
                              m[6] == true &&
                              m[7] == true &&
                              m[8] == false &&
                              m[9] == false &&
                              m[10] == false);
            }

            {
                var kws = new[] { "HangZhongA" };
                var ret = matcher.DoMatches(testNoCase, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == testNoCase.StringLength &&
                              m[0] == false &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true &&
                              m[6] == true &&
                              m[7] == true &&
                              m[8] == false &&
                              m[9] == false &&
                              m[10] == false);
            }

            {
                var kws = new[] { "HangZhonga" };
                var ret = matcher.DoMatches(testNoCase, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == testNoCase.StringLength &&
                              m[0] == false &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true &&
                              m[6] == true &&
                              m[7] == true &&
                              m[8] == false &&
                              m[9] == false &&
                              m[10] == false);
            }

            {
                var kws = new[] { "XINGZhongAb" };
                var ret = matcher.DoMatches(testNoCase, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == testNoCase.StringLength &&
                              m[0] == false &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true &&
                              m[6] == true &&
                              m[7] == true &&
                              m[8] == true &&
                              m[9] == false &&
                              m[10] == false);
            }

            {
                var kws = new[] { "aB", "," };
                var ret = matcher.DoMatches(testNoCase, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == testNoCase.StringLength &&
                              m[0] == false &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == true &&
                              m[8] == true &&
                              m[9] == true &&
                              m[10] == false);
            }

            {
                var kws = new[] { ",", ", " };
                var ret = matcher.DoMatches(testNoCase, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == testNoCase.StringLength &&
                              m[0] == false &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == true &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == false &&
                              m[8] == false &&
                              m[9] == true &&
                              m[10] == true);
            }



            {
                var kws = new[] { "A" };
                var ret = matcherCase.DoMatches(new MatchCache("啊a"), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m[0] == true &&
                              m[1] == false);
            }
            {
                var kws = new[] { "a" };
                var ret = matcherCase.DoMatches(new MatchCache("啊a"), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m[0] == true &&
                              m[1] == true);
            }

            {
                var kws = new[] { "DuoZ" };
                var ret = matcherCase.DoMatches(new MatchCache("多重多次,行中Ab, "), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == testNoCase.StringLength &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == false &&
                              m[8] == false &&
                              m[9] == false &&
                              m[10] == false);
            }

            {
                var kws = new[] { "DuoC" };
                matcherCase.AppendDescriptions(ref testNoCase);
                var ret = matcherCase.DoMatches(testNoCase, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == testNoCase.StringLength &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == true &&
                              m[3] == true &&
                              m[4] == false &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == false &&
                              m[8] == false &&
                              m[9] == false &&
                              m[10] == false);
            }

            {
                var kws = new[] { "Duoz", "HangZ" };
                var ret = matcherCase.DoMatches(testNoCase, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == testNoCase.StringLength &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true &&
                              m[6] == true &&
                              m[7] == false &&
                              m[8] == false &&
                              m[9] == false &&
                              m[10] == false);
            }

            {
                var kws = new[] { "Duoz", "XingZ" };
                var ret = matcherCase.DoMatches(testNoCase, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == testNoCase.StringLength &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true &&
                              m[6] == true &&
                              m[7] == false &&
                              m[8] == false &&
                              m[9] == false &&
                              m[10] == false);
            }


            var testCase = new MatchCache("多重多次,行中Ab, ");

            matcherCase.AppendDescriptions(ref testCase);
            {
                var kws = new[] { "XingZhongA" };
                var ret = matcherCase.DoMatches(testCase, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == testNoCase.StringLength &&
                              m[0] == false &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true &&
                              m[6] == true &&
                              m[7] == true &&
                              m[8] == false &&
                              m[9] == false &&
                              m[10] == false);
            }

            {
                var kws = new[] { "XingZhonga" };
                var ret = matcherCase.DoMatches(testCase, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                var kws = new[] { "HangZhongA" };
                var ret = matcherCase.DoMatches(testCase, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == testNoCase.StringLength &&
                              m[0] == false &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true &&
                              m[6] == true &&
                              m[7] == true &&
                              m[8] == false &&
                              m[9] == false &&
                              m[10] == false);
            }

            {
                var kws = new[] { "HangZhonga" };
                var ret = matcherCase.DoMatches(testCase, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                var kws = new[] { "xingzhongab" };
                var ret = matcherCase.DoMatches(testCase, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                var kws = new[] { "aB", "," };
                var ret = matcherCase.DoMatches(testCase, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }



            {
                var kws = new[] { ",", ", " };
                var ret = matcherCase.DoMatches(testCase, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == testNoCase.StringLength &&
                              m[0] == false &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == true &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == false &&
                              m[8] == false &&
                              m[9] == true &&
                              m[10] == true);
            }


            {
                var ret = matcher.DoMatches(new MatchCache("大夫A"), new[] { "Daf", "B" });
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == 3 &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == false);
            }
        }
 /// <summary>
 /// append cache for this match provider to MatchCache
 /// </summary>
 /// <returns></returns>
 public abstract void AppendDescriptions(ref MatchCache matchCache);
        public void FindMatchesTestCase()
        {
            var matcher = new JapaneseRomajiProvider(true);

            Assert.IsTrue(matcher.GetProviderName() == nameof(JapaneseRomajiProvider));
            var dspen = matcher.GetProviderDescriptionEn();
            var dsp   = matcher.GetProviderDescription();

            {
                {
                    string str = "abcdefg";
                    var    kws = new[] { "a" };
                    var    ret = matcher.DoMatches(new MatchCache(str), kws);
                    Assert.IsTrue(ret.IsMatchAllKeywords == false); // false by no Chinese char
                    Assert.IsTrue(ret.Keywords.Count == 1 && ret.Keywords[0] == "a");
                }

                {
                    string str = "abcdefg";
                    var    kws = new[] { "A" };
                    var    ret = matcher.DoMatches(new MatchCache(str), kws);
                    Assert.IsTrue(ret.IsMatchAllKeywords == false); // false by no Chinese char
                    Assert.IsTrue(ret.Keywords.Count == 1 && ret.Keywords[0] == "A");
                }
            }


            var org = new MatchCache("こんにちは, 世界A");

            matcher.AppendDescriptions(ref org);

            Assert.IsTrue(org.SpellCaches.First().Value.GetProviderName() == matcher.GetProviderName());


            {
                var kws = new[] { "kon" };
                var ret = matcher.DoMatches(org, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.StringLength &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == true &&
                              m[3] == true &&
                              m[4] == true &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == false &&
                              m[8] == false &&
                              m[9] == false);
            }

            {
                var kws = new[] { "konaa" };
                var ret = matcher.DoMatches(org, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                var kws = new[] { "konaA" };
                var ret = matcher.DoMatches(org, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.StringLength &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == true &&
                              m[3] == true &&
                              m[4] == true &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == false &&
                              m[8] == false &&
                              m[9] == true);
            }


            {
                var kws = new[] { "sk" };
                var ret = matcher.DoMatches(org, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.StringLength &&
                              m[0] == false &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == true &&
                              m[8] == true &&
                              m[9] == false);
            }

            {
                var kws = new[] { "se" };
                var ret = matcher.DoMatches(org, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.StringLength &&
                              m[0] == false &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == true &&
                              m[8] == true &&
                              m[9] == false);
            }

            {
                var kws = new[] { "skai" };
                var ret = matcher.DoMatches(org, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.StringLength &&
                              m[0] == false &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == true &&
                              m[8] == true &&
                              m[9] == false);
            }

            {
                var kws = new[] { "skaia" };
                var ret = matcher.DoMatches(org, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                var kws = new[] { "skaiA" };
                var ret = matcher.DoMatches(org, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.StringLength &&
                              m[0] == false &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == true &&
                              m[8] == true &&
                              m[9] == true);
            }

            {
                var kws = new[] { "," };
                var ret = matcher.DoMatches(org, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.StringLength &&
                              m[0] == false &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true &&
                              m[6] == false &&
                              m[7] == false &&
                              m[8] == false &&
                              m[9] == false);
            }


            matcher.AppendDescriptions(ref org);
            {
                var kws = new[] { "konse" };
                var ret = matcher.DoMatches(org, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.StringLength &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == true &&
                              m[3] == true &&
                              m[4] == true &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == true &&
                              m[8] == true &&
                              m[9] == false);
            }

            matcher.AppendDescriptions(ref org);
            {
                var kws = new[] { "kon", "se" };
                var ret = matcher.DoMatches(org, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.StringLength &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == true &&
                              m[3] == true &&
                              m[4] == true &&
                              m[5] == false &&
                              m[6] == false &&
                              m[7] == true &&
                              m[8] == true &&
                              m[9] == false);
            }

            matcher.AppendDescriptions(ref org);
            {
                var kws = new[] { "kon", "," };
                var ret = matcher.DoMatches(org, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.StringLength &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == true &&
                              m[3] == true &&
                              m[4] == true &&
                              m[5] == true &&
                              m[6] == false &&
                              m[7] == false &&
                              m[8] == false &&
                              m[9] == false);
            }

            {
                var kws = new[] { "chi" };
                var ret = matcher.DoMatches(org, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }


            {
                var kws = new[] { "kai" };
                var ret = matcher.DoMatches(org, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                var kws = new[] { "konkai" };
                var ret = matcher.DoMatches(org, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                var kws = new[] { "kon", "kai" };
                var ret = matcher.DoMatches(org, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            matcher.AppendDescriptions(ref org);
            {
                var kws = new[] { "kon", ",", "ABC" };
                var ret = matcher.DoMatches(org, kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.StringLength &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == true &&
                              m[3] == true &&
                              m[4] == true &&
                              m[5] == true &&
                              m[6] == false &&
                              m[7] == false &&
                              m[8] == false &&
                              m[9] == false);
            }
        }
 /// <summary>
 /// for subclass
 /// </summary>
 /// <param name="matchCache"></param>
 /// <param name="keywords"></param>
 /// <param name="keywordsInTrueCase"></param>
 /// <returns></returns>
 protected abstract MatchResult DoFindMatches(MatchCache matchCache, IEnumerable <string> keywords, IEnumerable <string> keywordsInTrueCase);
        public void FindMatchesTest()
        {
            var matcher     = new DiscreteMatchProvider(false);
            var matcherCase = new DiscreteMatchProvider(true);
            var dspen       = matcher.GetProviderDescriptionEn();
            var dsp         = matcher.GetProviderDescription();

            Assert.IsTrue(matcher.GetProviderName() == nameof(DiscreteMatchProvider));

            {
                var ret = matcher.DoMatches(new MatchCache(""), new[] { "" });
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
            }

            {
                string org = "abcdefg";
                var    str = new MatchCache(org);
                matcher.AppendDescriptions(ref str);
                matcherCase.AppendDescriptions(ref str);
            }

            {
                string org = "abcdefg";
                var    kws = new[] { "a" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(ret.Keywords.Count == 1 && ret.Keywords[0] == "a");
                Assert.IsTrue(m.Count == org.Length && m[0] == true && m[1] == false);
            }

            {
                string org = "abcdefg";
                var    kws = new[] { "A" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(ret.Keywords.Count == 1 && ret.Keywords[0] == "A");
                Assert.IsTrue(m.Count == org.Length && m[0] == true && m[1] == false);
            }

            {
                string org = "abcdefg";
                var    kws = new[] { "a" };
                var    ret = matcherCase.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.Keywords.Count == 1 && ret.Keywords[0] == "a");
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.Length && m[0] == true && m[1] == false);
            }

            {
                string org = "abcdefg";
                var    kws = new[] { "A" };
                var    ret = matcherCase.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.Keywords.Count == 1 && ret.Keywords[0] == "A");
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
                var m = ret.HitFlags;
                Assert.IsTrue(m.All(x => x == false));
            }

            {
                string org = "abcdefgabcdefg";
                var    kws = new[] { "defg", "abc" };
                var    ret = matcherCase.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.Length &&
                              m.All(x => x == true));
            }

            {
                string org = "abaaa";
                var    kws = new[] { "aa" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.Length &&
                              m[0] == true &&
                              m[1] == false &&
                              m[2] == true &&
                              m[3] == true &&
                              m[4] == true);
            }

            {
                string org = "abaa a";
                var    kws = new[] { "aa" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.Length &&
                              m[0] == true &&
                              m[1] == false &&
                              m[2] == true &&
                              m[3] == true &&
                              m[4] == false &&
                              m[5] == true);
            }
            {
                string org = "abaa a";
                var    kws = new[] { " " };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.Length &&
                              m[0] == false &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == true &&
                              m[5] == false);
            }
            {
                string org = "abAAa";
                var    kws = new[] { "aa" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.Length &&
                              m[0] == true &&
                              m[1] == false &&
                              m[2] == true &&
                              m[3] == true &&
                              m[4] == true);
            }
            {
                string org = "abAA a";
                var    kws = new[] { "aa" };
                var    ret = matcher.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.Length &&
                              m[0] == true &&
                              m[1] == false &&
                              m[2] == true &&
                              m[3] == true &&
                              m[4] == false &&
                              m[5] == true);
            }

            {
                string org = "abAA a";
                var    kws = new[] { "aA" };
                var    ret = matcherCase.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.Length &&
                              m[0] == true &&
                              m[1] == false &&
                              m[2] == true &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == false);
            }

            {
                string org = "abAA a";
                var    kws = new[] { "aa" };
                var    ret = matcherCase.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.Length &&
                              m[0] == true &&
                              m[1] == false &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true);
            }


            {
                string org = "abAA ab";
                var    kws = new[] { "aa", "ab" };
                var    ret = matcherCase.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == true);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.Length &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == true &&
                              m[6] == true);
            }


            {
                string org = "abAA a";
                var    kws = new[] { "ab", "AB" };
                var    ret = matcherCase.DoMatches(new MatchCache(org), kws);
                Assert.IsTrue(ret.IsMatchAllKeywords == false);
                var m = ret.HitFlags;
                Assert.IsTrue(m.Count == org.Length &&
                              m[0] == true &&
                              m[1] == true &&
                              m[2] == false &&
                              m[3] == false &&
                              m[4] == false &&
                              m[5] == false);
            }
        }