Exemplo n.º 1
0
        public void BuildTest()
        {
            {
                var matcher = Builder.Build(new[] { DiscreteMatchProvider.GetName() }, true);
                Assert.IsTrue(matcher.IsCaseSensitive);
                Assert.IsTrue(matcher.ProviderTypes.Count == 1);
                Assert.IsTrue(matcher.ProviderTypes[0] == DiscreteMatchProvider.GetName());
            }
            {
                var matcher = Builder.Build(new[] { DiscreteMatchProvider.GetName(), ChineseZhCnPinYinMatchProvider.GetName() }, false);
                Assert.IsTrue(matcher.IsCaseSensitive == false);
                Assert.IsTrue(matcher.ProviderTypes.Count == 2);
                Assert.IsTrue(matcher.ProviderTypes.Any(x => x == DiscreteMatchProvider.GetName()));
                Assert.IsTrue(matcher.ProviderTypes.Any(x => x == ChineseZhCnPinYinMatchProvider.GetName()));
            }
#if !NET45
            {
                var matcher = Builder.Build(new[] { JapaneseRomajiProvider.GetName(), ChineseZhCnPinYinInitialsMatchProvider.GetName() }, true);
                Assert.IsTrue(matcher.IsCaseSensitive == true);
                Assert.IsTrue(matcher.ProviderTypes.Count == 2);
                Assert.IsTrue(matcher.ProviderTypes.Any(x => x == JapaneseRomajiProvider.GetName()));
                Assert.IsTrue(matcher.ProviderTypes.Any(x => x == ChineseZhCnPinYinInitialsMatchProvider.GetName()));
            }
#endif
        }
Exemplo n.º 2
0
        private static void LoadProviders()
        {
            if (AvailableProviders.ContainsKey(DirectMatchProvider.GetName()) == false)
            {
                AvailableProviders.Add(DirectMatchProvider.GetName(), new DirectMatchProvider(false));
            }
            if (AvailableProviders.ContainsKey(InitialsMatchProvider.GetName()) == false)
            {
                AvailableProviders.Add(InitialsMatchProvider.GetName(), new InitialsMatchProvider(false));
            }
            if (AvailableProviders.ContainsKey(DiscreteMatchProvider.GetName()) == false)
            {
                AvailableProviders.Add(DiscreteMatchProvider.GetName(), new DiscreteMatchProvider(false));
            }
            if (AvailableProviders.ContainsKey(ChineseZhCnPinYinInitialsMatchProvider.GetName()) == false)
            {
                AvailableProviders.Add(ChineseZhCnPinYinInitialsMatchProvider.GetName(), new ChineseZhCnPinYinInitialsMatchProvider(false));
            }
            if (AvailableProviders.ContainsKey(ChineseZhCnPinYinMatchProvider.GetName()) == false)
            {
                AvailableProviders.Add(ChineseZhCnPinYinMatchProvider.GetName(), new ChineseZhCnPinYinMatchProvider(false));
            }

            try
            {
                var files = Directory.GetFiles(Directory.GetParent(typeof(Builder).Assembly.Location).FullName, "*.dll");
                foreach (var dllPath in files)
                {
                    var assembly  = Assembly.LoadFile(dllPath);
                    var types     = assembly.GetTypes();
                    var providers = types.Where(item =>
                                                item.IsSubclassOf(typeof(MatchProviderBase)) && !item.IsAbstract)
                                    .Select(type => CreateProviderInstance(type, false));

                    foreach (var provider in providers.OrderBy(x => x.GetProviderDescription()))
                    {
                        var t = provider.GetProviderName();
                        if (AvailableProviders.ContainsKey(t) == false)
                        {
                            AvailableProviders.Add(t, provider);
                        }
                    }
                }
            }
            catch (Exception)
            {
            }
        }
Exemplo n.º 3
0
        public void GetProviderDescriptionTest()
        {
            {
                var dsp1 = Builder.GetProviderDescription(DirectMatchProvider.GetName());
                var dsp2 = Builder.GetProviderDescriptionEn(DirectMatchProvider.GetName());
                Assert.IsTrue(!string.IsNullOrEmpty(dsp1));
                Assert.IsTrue(!string.IsNullOrEmpty(dsp2));
            }
            {
                var dsp1 = Builder.GetProviderDescription(InitialsMatchProvider.GetName());
                var dsp2 = Builder.GetProviderDescriptionEn(InitialsMatchProvider.GetName());
                Assert.IsTrue(!string.IsNullOrEmpty(dsp1));
                Assert.IsTrue(!string.IsNullOrEmpty(dsp2));
            }
            {
                var dsp1 = Builder.GetProviderDescription(DiscreteMatchProvider.GetName());
                var dsp2 = Builder.GetProviderDescriptionEn(DiscreteMatchProvider.GetName());
                Assert.IsTrue(!string.IsNullOrEmpty(dsp1));
                Assert.IsTrue(!string.IsNullOrEmpty(dsp2));
            }
            {
                var dsp1 = Builder.GetProviderDescription(ChineseZhCnPinYinMatchProvider.GetName());
                var dsp2 = Builder.GetProviderDescriptionEn(ChineseZhCnPinYinMatchProvider.GetName());
                Assert.IsTrue(!string.IsNullOrEmpty(dsp1));
                Assert.IsTrue(!string.IsNullOrEmpty(dsp2));
            }
            {
                var dsp1 = Builder.GetProviderDescription(ChineseZhCnPinYinInitialsMatchProvider.GetName());
                var dsp2 = Builder.GetProviderDescriptionEn(ChineseZhCnPinYinInitialsMatchProvider.GetName());
                Assert.IsTrue(!string.IsNullOrEmpty(dsp1));
                Assert.IsTrue(!string.IsNullOrEmpty(dsp2));
            }
#if !NET45
            {
                var dsp1 = Builder.GetProviderDescription(JapaneseRomajiProvider.GetName());
                var dsp2 = Builder.GetProviderDescriptionEn(JapaneseRomajiProvider.GetName());
                Assert.IsTrue(!string.IsNullOrEmpty(dsp1));
                Assert.IsTrue(!string.IsNullOrEmpty(dsp2));
            }
#endif
        }
Exemplo n.º 4
0
        public void MatchTest_String_SingleKeyword()
        {
            {
                var    matcher = Builder.Build(new[] { DirectMatchProvider.GetName() }, false);
                string str     = "HelloWorld 你好世界!";

                Assert.IsTrue(matcher.Match(str, "llow").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "llOW").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "世界").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "!").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "!").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(str, "He l").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(str, "  ").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(str, "啊").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(str, "X").IsMatchAllKeywords == false);
            }

            {
                var    matcher = Builder.Build(new[] { DirectMatchProvider.GetName(), ChineseZhCnPinYinInitialsMatchProvider.GetName() }, false);
                string str     = "HelloWorld 你好世界!";

                Assert.IsTrue(matcher.Match(str, "llow").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "llOW").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "世界").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "!").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "NH").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, " NH").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "nh").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, " nH").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "ld nh").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "ld NH").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "!").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(str, "He l").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(str, "  ").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(str, "啊").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(str, "X").IsMatchAllKeywords == false);
            }


            {
                var    matcher = Builder.Build(new[] { DirectMatchProvider.GetName(), ChineseZhCnPinYinInitialsMatchProvider.GetName() }, true);
                string str     = "HelloWorld 你好世界!";

                Assert.IsTrue(matcher.Match(str, "llow").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(str, "lloW").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "世界").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "!").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "NH").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, " NH").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "nh").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, " nH").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "ld nh").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "ld NH").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "lD nh").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(str, "lD NH").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(str, "!").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(str, "He l").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(str, "  ").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(str, "啊").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(str, "X").IsMatchAllKeywords == false);
            }


            {
                var    matcher = Builder.Build(new[] { DirectMatchProvider.GetName(), ChineseZhCnPinYinInitialsMatchProvider.GetName(), ChineseZhCnPinYinMatchProvider.GetName() }, false);
                string str     = "HelloWorld 你好世界!";

                Assert.IsTrue(matcher.Match(str, "llow").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "llOW").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "世界").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "SHIJIE").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "!").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "NH").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, " NH").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "nh").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, " nH").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "ld nh").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "ld NH").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "ld NIHA").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "ld NIHAo").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(str, "!").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(str, "He l").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(str, "  ").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(str, "啊").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(str, "X").IsMatchAllKeywords == false);
            }
        }
Exemplo n.º 5
0
        public void MatchTest_Cache_MultiKeywords()
        {
            {
                var    matcher = Builder.Build(new[] { DirectMatchProvider.GetName(), ChineseZhCnPinYinInitialsMatchProvider.GetName() }, false);
                string str     = "HelloWorld 你好世界!";
                var    cache   = matcher.CreateStringCache(str);

                Assert.IsTrue(matcher.Match(cache, new[] { "llow", "NH" }).IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, new[] { "llOW", "NH" }).IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, new[] { "llOW", "世界" }).IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, new[] { "lloW", "世界", "!" }).IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, new[] { "nh", "!" }).IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, new[] { "lloW", "世界", "!" }).IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, new[] { "lloW", "X" }).IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, new[] { "lloW", "  " }).IsMatchAllKeywords == false);
            }


            {
                var    matcher = Builder.Build(new[] { DirectMatchProvider.GetName(), ChineseZhCnPinYinInitialsMatchProvider.GetName() }, true);
                string str     = "HelloWorld 你好世界!";
                var    cache   = matcher.CreateStringCache(str);

                Assert.IsTrue(matcher.Match(cache, new[] { "llow", "NH" }).IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, new[] { "llOW", "NH" }).IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, new[] { "llOW", "世界" }).IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, new[] { "lloW", "世界" }).IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, new[] { "lloW", "世界", "!" }).IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, new[] { "nh", "!" }).IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, new[] { "lloW", "世界", "!" }).IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, new[] { "lloW", "X" }).IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, new[] { "lloW", "  " }).IsMatchAllKeywords == false);
            }

            {
                var    matcher = Builder.Build(new[] { DirectMatchProvider.GetName(), ChineseZhCnPinYinMatchProvider.GetName() }, false);
                string str     = "HelloWorld 你好世界!";
                var    cache   = matcher.CreateStringCache(str);

                Assert.IsTrue(matcher.Match(cache, new[] { "llow", "NH" }).IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, new[] { "llOW", "NH" }).IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, new[] { "llOW", "世界" }).IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, new[] { "lloW", "世界", "!" }).IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, new[] { "lloW", "SHIJIE", "!" }).IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, new[] { "NI", "hao", "!" }).IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, new[] { "NI", "hao", "w" }).IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, new[] { "lloW", "世界", "!" }).IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, new[] { "lloW", "X" }).IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, new[] { "lloW", "  " }).IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, new[] { "a", " " }).IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, new[] { "a" }).IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, new[] { " " }).IsMatchAllKeywords == true);
            }
        }
Exemplo n.º 6
0
        public void MatchTest_MatchCache_SingleKeyword()
        {
            {
                var    matcher = Builder.Build(new[] { DirectMatchProvider.GetName(), ChineseZhCnPinYinInitialsMatchProvider.GetName() }, false);
                string str     = "HelloWorld 你好世界!";
                var    cache   = matcher.CreateStringCache(str);

                Assert.IsTrue(matcher.Match(cache, "llow").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, "llOW").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, "世界").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, "!").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, "NH").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, " NH").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, "nh").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, " nH").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, "ld nh").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, "ld NH").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, "!").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, "He l").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, "  ").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, "啊").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, "a").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, "X").IsMatchAllKeywords == false);
            }


            {
                var    matcher = Builder.Build(new[] { DirectMatchProvider.GetName(), ChineseZhCnPinYinInitialsMatchProvider.GetName() }, true);
                string str     = "HelloWorld 你好世界!";
                var    cache   = matcher.CreateStringCache(str);

                Assert.IsTrue(matcher.Match(cache, "llow").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, "lloW").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, "世界").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, "!").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, "NH").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, " NH").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, "nh").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, " nH").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, "ld nh").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, "ld NH").IsMatchAllKeywords == true);
                Assert.IsTrue(matcher.Match(cache, "lD nh").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, "lD NH").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, "!").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, "He l").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, "  ").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, "啊").IsMatchAllKeywords == false);
                Assert.IsTrue(matcher.Match(cache, "X").IsMatchAllKeywords == false);
            }
        }
        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);
            }
        }