public void TestSimplePhrase()
        {
            var tokens = tokenizer.Tokenize("この動詞の変化を言えますか");
            var words  = WordConjungateCombiner.Combine(tokens, dictionary);

            Assert.AreEqual(7, words.Count);
            Assert.AreEqual("この", words[0].Surface);
            Assert.AreEqual("動詞", words[1].Surface);
            Assert.AreEqual("の", words[2].Surface);
            Assert.AreEqual("変化", words[3].Surface);
            Assert.AreEqual("を", words[4].Surface);
            Assert.AreEqual("言えます", words[5].Surface);
            Assert.AreEqual("か", words[6].Surface);

            Assert.AreEqual("", words[0].Conjugation);
            Assert.AreEqual("", words[1].Conjugation);
            Assert.AreEqual("", words[2].Conjugation);
            Assert.AreEqual("", words[3].Conjugation);
            Assert.AreEqual("", words[4].Conjugation);
            Assert.AreEqual("[polite] ", words[5].Conjugation);
            Assert.AreEqual("", words[6].Conjugation);

            Assert.AreEqual("この", words[0].BaseForm);
            Assert.AreEqual("動詞", words[1].BaseForm);
            Assert.AreEqual("の", words[2].BaseForm);
            Assert.AreEqual("変化", words[3].BaseForm);
            Assert.AreEqual("を", words[4].BaseForm);
            Assert.AreEqual("言える", words[5].BaseForm);
            Assert.AreEqual("か", words[6].BaseForm);
        }
        public void TestIchidan()
        {
            string path = RESOURCE + "TestIchidanConjungate.txt";

            using (var file = File.OpenRead(path))
                using (var reader = new StreamReader(file))
                {
                    var line = reader.ReadLine();
                    Assert.IsTrue(!String.IsNullOrWhiteSpace(line));

                    var tokens = tokenizer.Tokenize(line);
                    var words  = WordConjungateCombiner.Combine(tokens, dictionary);
                    int count  = 0;
                    while (!reader.EndOfStream)
                    {
                        line = reader.ReadLine();
                        if (string.IsNullOrWhiteSpace(line))
                        {
                            continue;
                        }

                        var array = line.Split(new string[] { ";", ";" }, StringSplitOptions.None);
                        Assert.AreEqual(array[0].Trim(), words[count].Surface.Trim());
                        Assert.AreEqual(array[1].Trim(), words[count].Conjugation.Trim());
                        Assert.AreEqual(array[2].Trim(), words[count].BaseForm.Trim());
                        count++;
                    }
                }
        }
        public void TestTrySplitWordNotInDictionary()
        {
            var tokens = tokenizer.Tokenize("アークプリースト");
            var words  = WordConjungateCombiner.Combine(tokens, dictionary);

            Assert.AreEqual(2, words.Count);
            Assert.AreEqual("アーク", words[0].Surface.Trim());
            Assert.AreEqual("プリースト", words[1].Surface.Trim());
            Assert.AreEqual("アーク", words[0].Reading.Trim());
            Assert.AreEqual("プリースト", words[1].Reading.Trim());
            Assert.AreEqual("アーク", words[0].Pronunciation.Trim());
            Assert.AreEqual("プリースト", words[1].Pronunciation.Trim());

            tokens = tokenizer.Tokenize("昨日の残りもの");
            words  = WordConjungateCombiner.Combine(tokens, dictionary);
            Assert.AreEqual(4, words.Count);
            Assert.AreEqual("残り", words[2].Surface.Trim());
            Assert.AreEqual("ノコリ", words[2].Reading.Trim());
            Assert.AreEqual("ノコリ", words[2].Pronunciation.Trim());
            Assert.AreEqual("もの", words[3].Surface.Trim());
            Assert.AreEqual("モノ", words[3].Reading.Trim());
            Assert.AreEqual("モノ", words[3].Pronunciation.Trim());

            tokens = tokenizer.Tokenize("ミツラギ");
            words  = WordConjungateCombiner.Combine(tokens, dictionary);
            Assert.AreEqual(1, words.Count);
            Assert.AreEqual("ミツラギ", words[0].Surface.Trim());
        }
        public void TestReduceWithBaseForm()
        {
            var tokens = tokenizer.Tokenize("始めてみることにした");
            var words  = WordConjungateCombiner.Combine(tokens, dictionary);

            Assert.AreEqual(5, words.Count);
            int             index   = words.FindIndex(0, words.Count, (x) => { return(x.Surface.Contains("こと")); });
            WordListReducer reducer = new WordListReducer();
            var             newWord = reducer.ReduceOnce(index, words, dictionary, true);

            Assert.AreEqual("ことにした", newWord.Surface);
            Assert.AreEqual("コトニシタ", newWord.Pronunciation);
            Assert.AreEqual("コトニシタ", newWord.Reading);
            Assert.AreEqual("ことにする", newWord.BaseForm);

            tokens = tokenizer.Tokenize("というものであった");
            words  = WordConjungateCombiner.Combine(tokens, dictionary);
            Assert.AreEqual(3, words.Count);
            index   = words.FindIndex(0, words.Count, (x) => { return(x.Surface.Contains("もの")); });
            reducer = new WordListReducer();
            newWord = reducer.ReduceOnce(index, words, dictionary, true);
            Assert.AreEqual("ものであった", newWord.Surface);
            Assert.AreEqual("モノデアッタ", newWord.Pronunciation);
            Assert.AreEqual("モノデアッタ", newWord.Reading);
            Assert.AreEqual("ものである", newWord.BaseForm);
        }
        public void TestAllSampleSentences()
        {
            using (var examples = File.OpenRead(RESOURCE + "/TestReducer.csv"))
                using (var reader = new StreamReader(examples))
                {
                    while (!reader.EndOfStream)
                    {
                        var line = reader.ReadLine();
                        if (String.IsNullOrWhiteSpace(line))
                        {
                            continue;
                        }

                        var             split       = line.Split(new string[] { "\t" }, StringSplitOptions.RemoveEmptyEntries);
                        var             tokens      = tokenizer.Tokenize(split[0]);
                        var             actualWords = WordConjungateCombiner.Combine(tokens, dictionary);
                        WordListReducer reducer     = new WordListReducer();
                        actualWords = reducer.ReduceAll(actualWords, dictionary);

                        var expectedWords = split[1].Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);

                        for (int i = 0; i < expectedWords.Length; i++)
                        {
                            Assert.AreEqual(expectedWords[i], actualWords[i].Surface);
                        }
                    }
                }
        }
        public void TestSimpleVerbWrongConjugation()
        {
            var tokens = tokenizer.Tokenize("読んたら食べたられる呼びない呼ばれらせる呼びませんでた");
            var words  = WordConjungateCombiner.Combine(tokens, dictionary);

            Assert.AreEqual("読ん", words[0].Surface);
            Assert.AreEqual("", words[0].Conjugation.Trim());
            Assert.AreEqual("たら", words[1].Surface);
            Assert.AreEqual("", words[1].Conjugation.Trim());

            Assert.AreEqual("食べたら", words[2].Surface);
            Assert.AreEqual("[-tara]", words[2].Conjugation.Trim());
            Assert.AreEqual("れる", words[3].Surface);
            Assert.AreEqual("", words[3].Conjugation.Trim());

            Assert.AreEqual("呼び", words[4].Surface);
            Assert.AreEqual("[masu stem]", words[4].Conjugation.Trim());
            Assert.AreEqual("ない", words[5].Surface);
            Assert.AreEqual("", words[5].Conjugation.Trim());

            Assert.AreEqual("呼ばれ", words[6].Surface);
            Assert.AreEqual("[passive]", words[6].Conjugation.Trim());
            Assert.AreEqual("ら", words[7].Surface);
            Assert.AreEqual("", words[7].Conjugation.Trim());
            Assert.AreEqual("せる", words[8].Surface);
            Assert.AreEqual("", words[8].Conjugation.Trim());

            Assert.AreEqual("呼びません", words[9].Surface);
            Assert.AreEqual("[polite] [negative]", words[9].Conjugation.Trim());
            Assert.AreEqual("で", words[10].Surface);
            Assert.AreEqual("", words[10].Conjugation.Trim());
            Assert.AreEqual("た", words[11].Surface);
            Assert.AreEqual("", words[11].Conjugation.Trim());
        }
        public void TestFullAndPartialWordMatchInDictionary()
        {
            var             tokens  = tokenizer.Tokenize("だいがく");
            var             words   = WordConjungateCombiner.Combine(tokens, dictionary);
            WordListReducer reducer = new WordListReducer();

            words = reducer.ReduceAll(words, dictionary);
            Assert.AreEqual(1, words.Count);
            Assert.AreEqual("だいがく", words[0].Surface);
            Assert.AreEqual("ダイガク", words[0].Reading);
            Assert.AreEqual("ダイガク", words[0].Pronunciation);
            Assert.IsTrue(words[0].IsInDictionary);

            tokens  = tokenizer.Tokenize("だいが");
            words   = WordConjungateCombiner.Combine(tokens, dictionary);
            reducer = new WordListReducer();
            words   = reducer.ReduceAll(words, dictionary);
            Assert.AreEqual(2, words.Count);

            Assert.AreEqual("だい", words[0].Surface);
            Assert.AreEqual("が", words[1].Surface);

            Assert.AreEqual("ダイ", words[0].Reading);
            Assert.AreEqual("ガ", words[1].Reading);

            Assert.AreEqual("ダイ", words[0].Pronunciation);
            Assert.AreEqual("ガ", words[1].Pronunciation);
        }
        public void TestCorrectUnknowStatusKatakana()
        {
            var tokens = tokenizer.Tokenize("母はパイを口に入れた瞬間に目がキラリと輝いた。");
            var words  = WordConjungateCombiner.Combine(tokens, dictionary);

            Assert.AreEqual(true, words[11].IsInDictionary);
            Assert.AreEqual(false, words[11].IsUnknownWord);
        }
        public void TestAdverbToFollow()
        {
            var tokens = tokenizer.Tokenize("意外と美味しかったので");
            var words  = WordConjungateCombiner.Combine(tokens, dictionary);

            Assert.IsTrue(words[0].IsInDictionary);
            Assert.AreEqual("意外と", words[0].Surface);
            Assert.AreEqual("意外", words[0].BaseForm);
        }
        public void TestIchidanCombineYoConjugation()
        {
            var tokens = tokenizer.Tokenize("うちまで辿り着けよ");
            var words  = WordConjungateCombiner.Combine(tokens, dictionary);

            Assert.AreEqual(4, words.Count);
            Assert.AreEqual("着けよ", words[3].Surface.Trim());
            Assert.AreEqual("[imperative]", words[3].Conjugation.Trim());
        }
        public void TestUndetectAdverbForm()
        {
            var tokens = tokenizer.Tokenize("恐ろしく硬いもので");
            var words  = WordConjungateCombiner.Combine(tokens, dictionary);

            Assert.AreEqual(4, words.Count);
            Assert.AreEqual("恐ろしく", words[0].Surface);
            Assert.AreEqual("恐ろしい", words[0].BaseForm);
            Assert.AreEqual("[adverb]", words[0].Conjugation.Trim());
        }
        public void TestSouConjugation()
        {
            var tokens = tokenizer.Tokenize("来そう泳ぎそう食べそう言いそう読みそう記しそう知りそうしそうきそう書きそう");
            var words  = WordConjungateCombiner.Combine(tokens, dictionary);

            foreach (var word in words)
            {
                Assert.AreEqual("[-sou]", word.Conjugation.Trim());
            }
        }
        public void TestTaiSou()
        {
            var tokens = tokenizer.Tokenize("言いたそうに");
            var words  = WordConjungateCombiner.Combine(tokens, dictionary);

            Assert.AreEqual(3, words.Count);
            Assert.AreEqual("言いた", words[0].Surface.Trim());
            Assert.AreEqual("言う", words[0].BaseForm.Trim());
            Assert.AreEqual("[-tai]", words[0].Conjugation.Trim());
        }
        public void TestNotValidVerb()
        {
            var             tokens   = tokenizer.Tokenize("依代とした");
            var             words    = WordConjungateCombiner.Combine(tokens, dictionary);
            WordListReducer reducer  = new WordListReducer();
            var             newWords = reducer.ReduceAll(words, dictionary);

            Assert.AreEqual(3, newWords.Count);
            Assert.AreEqual("依代", newWords[0].Surface);
            Assert.AreEqual(0, newWords[0].LinkWordGroup);
        }
        public void TestIfRemoveWrongEndIndex()
        {
            var             tokens  = tokenizer.Tokenize("私だからな");
            var             words   = WordConjungateCombiner.Combine(tokens, dictionary);
            WordListReducer reducer = new WordListReducer();
            var             newWord = reducer.ReduceOnce(1, words, dictionary, true);

            Assert.AreEqual("だから", newWord.Surface);
            Assert.AreEqual("ダカラ", newWord.Pronunciation);
            Assert.AreEqual("ダカラ", newWord.Reading);
        }
        public void TestWrongReadingAfterReduce()
        {
            var             tokens   = tokenizer.Tokenize("今日は一歩も");
            var             words    = WordConjungateCombiner.Combine(tokens, dictionary);
            WordListReducer reducer  = new WordListReducer();
            var             newWords = reducer.ReduceAll(words, dictionary);

            Assert.AreEqual("一歩", newWords[2].Surface);
            Assert.AreEqual("イッポ", newWords[2].Pronunciation);
            Assert.AreEqual("イッポ", newWords[2].Reading);
        }
        public void TestTariConjugation()
        {
            var tokens = tokenizer.Tokenize("泳いだり食べたり言ったり読んだり書いたり記したり知ったりしたり来たりきたり美味しかったりだったり");
            var words  = WordConjungateCombiner.Combine(tokens, dictionary);

            Assert.AreEqual(12, words.Count);
            foreach (var word in words)
            {
                Assert.AreEqual("[-tari]", word.Conjugation.Trim());
            }
        }
        public void TestReduceOnce()
        {
            var             tokens  = tokenizer.Tokenize("そこで私たちを待っている幸福が、私たちが望むような幸福ではないかもしれない。");
            var             words   = WordConjungateCombiner.Combine(tokens, dictionary);
            int             index   = words.FindIndex(0, words.Count, (x) => { return(x.Surface.Contains("かも")); });
            WordListReducer reducer = new WordListReducer();
            var             newWord = reducer.ReduceOnce(index, words, dictionary, true);

            Assert.AreEqual("かもしれない", newWord.Surface);
            Assert.AreEqual("カモシレナイ", newWord.Pronunciation);
            Assert.AreEqual("カモシレナイ", newWord.Reading);
        }
        public void TestLinkGroupCount()
        {
            var             tokens   = tokenizer.Tokenize("そわそわしだしたア");
            var             words    = WordConjungateCombiner.Combine(tokens, dictionary);
            WordListReducer reducer  = new WordListReducer();
            var             newWords = reducer.ReduceAll(words, dictionary);

            Assert.AreEqual("し", newWords[1].Surface);
            Assert.AreEqual("だした", newWords[2].Surface);
            Assert.AreEqual(1, newWords[1].LinkWordGroup);
            Assert.AreEqual(1, newWords[2].LinkWordGroup);
        }
        public void TestAdjectiveVolitionalForm()
        {
            var tokens = tokenizer.Tokenize("赤かろう。なかろう。赤くなかろう。");
            var words  = WordConjungateCombiner.Combine(tokens, dictionary);

            Assert.AreEqual("赤かろう", words[0].Surface);
            Assert.AreEqual("[volitional]", words[0].Conjugation.Trim());
            Assert.AreEqual("なかろう", words[2].Surface);
            Assert.AreEqual("[volitional]", words[2].Conjugation.Trim());
            Assert.AreEqual("赤くなかろう", words[4].Surface);
            Assert.AreEqual("[negative] [volitional]", words[4].Conjugation.Trim());
        }
        public void TestTaiConjugation()
        {
            var tokens = tokenizer.Tokenize("泳ぎたい食べたい言いたい読みたい書きたい記したい知りたい食べたい");
            var words  = WordConjungateCombiner.Combine(tokens, dictionary);

            Assert.AreEqual(8, words.Count);
            Assert.AreEqual("[-tai]", words[0].Conjugation.Trim());
            Assert.AreEqual("[-tai]", words[1].Conjugation.Trim());
            Assert.AreEqual("[-tai]", words[2].Conjugation.Trim());
            Assert.AreEqual("[-tai]", words[3].Conjugation.Trim());
            Assert.AreEqual("[-tai]", words[4].Conjugation.Trim());
            Assert.AreEqual("[-tai]", words[5].Conjugation.Trim());
            Assert.AreEqual("[-tai]", words[6].Conjugation.Trim());
            Assert.AreEqual("[-tai]", words[7].Conjugation.Trim());

            tokens = tokenizer.Tokenize("泳ぎたくない食べたくない買いたくない読みたくない書きたくない記したくない知りたくない食べたくない");
            words  = WordConjungateCombiner.Combine(tokens, dictionary);
            Assert.AreEqual(8, words.Count);
            Assert.AreEqual("[-tai] [negative]", words[0].Conjugation.Trim());
            Assert.AreEqual("[-tai] [negative]", words[1].Conjugation.Trim());
            Assert.AreEqual("[-tai] [negative]", words[2].Conjugation.Trim());
            Assert.AreEqual("[-tai] [negative]", words[3].Conjugation.Trim());
            Assert.AreEqual("[-tai] [negative]", words[4].Conjugation.Trim());
            Assert.AreEqual("[-tai] [negative]", words[5].Conjugation.Trim());
            Assert.AreEqual("[-tai] [negative]", words[6].Conjugation.Trim());
            Assert.AreEqual("[-tai] [negative]", words[7].Conjugation.Trim());

            tokens = tokenizer.Tokenize("泳ぎたかった食べたかった買いたかった読みたかった書きたかった記したかった知りたかった食べたかった");
            words  = WordConjungateCombiner.Combine(tokens, dictionary);
            Assert.AreEqual(8, words.Count);
            Assert.AreEqual("[-tai] [past]", words[0].Conjugation.Trim());
            Assert.AreEqual("[-tai] [past]", words[1].Conjugation.Trim());
            Assert.AreEqual("[-tai] [past]", words[2].Conjugation.Trim());
            Assert.AreEqual("[-tai] [past]", words[3].Conjugation.Trim());
            Assert.AreEqual("[-tai] [past]", words[4].Conjugation.Trim());
            Assert.AreEqual("[-tai] [past]", words[5].Conjugation.Trim());
            Assert.AreEqual("[-tai] [past]", words[6].Conjugation.Trim());
            Assert.AreEqual("[-tai] [past]", words[7].Conjugation.Trim());

            tokens = tokenizer.Tokenize("泳ぎたくて食べたくて買いたくて読みたくて書きたくて記したくて知りたくて食べたくて");
            words  = WordConjungateCombiner.Combine(tokens, dictionary);
            Assert.AreEqual(8, words.Count);
            Assert.AreEqual("[-tai] [-te]", words[0].Conjugation.Trim());
            Assert.AreEqual("[-tai] [-te]", words[1].Conjugation.Trim());
            Assert.AreEqual("[-tai] [-te]", words[2].Conjugation.Trim());
            Assert.AreEqual("[-tai] [-te]", words[3].Conjugation.Trim());
            Assert.AreEqual("[-tai] [-te]", words[4].Conjugation.Trim());
            Assert.AreEqual("[-tai] [-te]", words[5].Conjugation.Trim());
            Assert.AreEqual("[-tai] [-te]", words[6].Conjugation.Trim());
            Assert.AreEqual("[-tai] [-te]", words[7].Conjugation.Trim());
        }
        public void TestDeshou()
        {
            var tokens = tokenizer.Tokenize("英雄なんでしょう");
            var words  = WordConjungateCombiner.Combine(tokens, dictionary);

            Assert.AreEqual(4, words.Count);
            Assert.AreEqual("でしょう", words[3].Surface.Trim());
            Assert.AreEqual("です", words[3].BaseForm.Trim());

            tokens = tokenizer.Tokenize("言うのだろう");
            words  = WordConjungateCombiner.Combine(tokens, dictionary);
            Assert.AreEqual(3, words.Count);
            Assert.AreEqual("だろう", words[2].Surface.Trim());
            Assert.AreEqual("だ", words[2].BaseForm.Trim());
        }
        public void TestCausativeImperative()
        {
            var tokens = tokenizer.Tokenize("脱がせろ食べられろ買わせろ読ませろ書かせろ記させろ遣らせろ脱がせろ");
            var words  = WordConjungateCombiner.Combine(tokens, dictionary);

            Assert.AreEqual(8, words.Count);
            Assert.AreEqual("[causative] [imperative]", words[0].Conjugation.Trim());
            Assert.AreEqual("[passive or potential] [imperative]", words[1].Conjugation.Trim());
            Assert.AreEqual("[causative] [imperative]", words[2].Conjugation.Trim());
            Assert.AreEqual("[causative] [imperative]", words[3].Conjugation.Trim());
            Assert.AreEqual("[causative] [imperative]", words[4].Conjugation.Trim());
            Assert.AreEqual("[causative] [imperative]", words[5].Conjugation.Trim());
            Assert.AreEqual("[causative] [imperative]", words[6].Conjugation.Trim());
            Assert.AreEqual("[causative] [imperative]", words[7].Conjugation.Trim());
        }
        public void TestReduceUnkownWord()
        {
            var             tokens   = tokenizer.Tokenize("洋ゲーで日本語ローカライズされてない");
            var             words    = WordConjungateCombiner.Combine(tokens, dictionary);
            WordListReducer reducer  = new WordListReducer();
            var             newWords = reducer.ReduceAll(words, dictionary);

            Assert.IsTrue(newWords[0].IsInDictionary);
            Assert.IsTrue(!newWords[0].IsUnknownWord);
            Assert.AreEqual("洋ゲー", newWords[0].Surface);
            Assert.AreEqual("ヨーゲー", newWords[0].Pronunciation);
            Assert.AreEqual("ヨウゲー", newWords[0].Reading);

            Assert.IsTrue(newWords[3].IsInDictionary);
            Assert.IsTrue(!newWords[3].IsUnknownWord);
        }
        public void TestGodanPotentialYoConjugation()
        {
            var tokens = tokenizer.Tokenize("を手伝えよ。を手伝えよか");
            var words  = WordConjungateCombiner.Combine(tokens, dictionary);

            Assert.AreEqual(7, words.Count);
            Assert.AreEqual("手伝え", words[1].Surface.Trim());
            Assert.AreEqual("テツダエ", words[1].Pronunciation.Trim());
            Assert.AreEqual("テツダエ", words[1].Reading.Trim());
            Assert.AreEqual("[imperative]", words[1].Conjugation.Trim());

            Assert.AreEqual("手伝えよ", words[5].Surface.Trim());
            Assert.AreEqual("テツダエヨ", words[5].Pronunciation.Trim());
            Assert.AreEqual("テツダエヨ", words[5].Reading.Trim());
            Assert.AreEqual("[potential] [imperative]", words[5].Conjugation.Trim());
        }
        public void TestNiWaInComplete()
        {
            var             tokens  = tokenizer.Tokenize("そこに");
            var             words   = WordConjungateCombiner.Combine(tokens, dictionary);
            WordListReducer reducer = new WordListReducer();

            words = reducer.ReduceAll(words, dictionary);
            Assert.AreEqual(2, words.Count);
            Assert.AreEqual("そこ", words[0].Surface);
            Assert.AreEqual("に", words[1].Surface);

            Assert.AreEqual("ソコ", words[0].Reading);
            Assert.AreEqual("ニ", words[1].Reading);

            Assert.AreEqual("ソコ", words[0].Pronunciation);
            Assert.AreEqual("ニ", words[1].Pronunciation);
        }
        public void TestMasuStem()
        {
            var tokens = tokenizer.Tokenize("脱ぎ食べ言い飲み記し知り行き呼び");
            var words  = WordConjungateCombiner.Combine(tokens, dictionary);

            Assert.AreEqual(8, words.Count);
            foreach (var word in words)
            {
                Assert.AreEqual("[masu stem]", word.Conjugation.Trim());
            }

            tokens = tokenizer.Tokenize("何をし。これへ来。これへきつつ。");
            words  = WordConjungateCombiner.Combine(tokens, dictionary);
            Assert.AreEqual("[masu stem]", words[2].Conjugation.Trim());
            Assert.AreEqual("[masu stem]", words[6].Conjugation.Trim());
            Assert.AreEqual("[masu stem]", words[10].Conjugation.Trim());
        }
        public void TestSpecialChar()
        {
            var             tokens  = tokenizer.Tokenize("そこで|私たち*を待って&いる^。");
            var             words   = WordConjungateCombiner.Combine(tokens, dictionary);
            WordListReducer reducer = new WordListReducer();

            words = reducer.ReduceAll(words, dictionary);
            Assert.AreEqual(9, words.Count);
            Assert.AreEqual("そこで", words[0].Surface);
            Assert.AreEqual("|", words[1].Surface);
            Assert.AreEqual("私たち", words[2].Surface);
            Assert.AreEqual("*", words[3].Surface);
            Assert.AreEqual("を", words[4].Surface);
            Assert.AreEqual("待って", words[5].Surface);
            Assert.AreEqual("&", words[6].Surface);
            Assert.AreEqual("いる", words[7].Surface);
            Assert.AreEqual("^。", words[8].Surface);
        }
        public void TestHiraganaOnlyWord()
        {
            var             tokens  = tokenizer.Tokenize("そうかもしれない");
            var             words   = WordConjungateCombiner.Combine(tokens, dictionary);
            WordListReducer reducer = new WordListReducer();

            words = reducer.ReduceAll(words, dictionary);
            Assert.AreEqual(3, words.Count);
            Assert.AreEqual("そう", words[0].Surface);
            Assert.AreEqual("かも", words[1].Surface);
            Assert.AreEqual("しれない", words[2].Surface);

            Assert.AreEqual("ソウ", words[0].Reading);
            Assert.AreEqual("カモ", words[1].Reading);
            Assert.AreEqual("シレナイ", words[2].Reading);

            Assert.AreEqual("ソー", words[0].Pronunciation);
            Assert.AreEqual("カモ", words[1].Pronunciation);
            Assert.AreEqual("シレナイ", words[2].Pronunciation);
        }
        public void TestParticle()
        {
            var             tokens  = tokenizer.Tokenize("ここら辺には見るべきところがたくさんあります。");
            var             words   = WordConjungateCombiner.Combine(tokens, dictionary);
            WordListReducer reducer = new WordListReducer();

            words = reducer.ReduceAll(words, dictionary);
            Assert.AreEqual("ここら辺", words[0].Surface);
            Assert.AreEqual("に", words[1].Surface);
            Assert.AreEqual("は", words[2].Surface);
            Assert.AreEqual("見る", words[3].Surface);
            Assert.AreEqual("べき", words[4].Surface);
            Assert.AreEqual("ところ", words[5].Surface);
            Assert.AreEqual("が", words[6].Surface);
            Assert.AreEqual("たくさん", words[7].Surface);
            Assert.AreEqual("あります", words[8].Surface);
            Assert.AreEqual("。", words[9].Surface);

            Assert.AreEqual("ココラヘン", words[0].Reading);
            Assert.AreEqual("ニ", words[1].Reading);
            Assert.AreEqual("ハ", words[2].Reading);
            Assert.AreEqual("ミル", words[3].Reading);
            Assert.AreEqual("ベキ", words[4].Reading);
            Assert.AreEqual("トコロ", words[5].Reading);
            Assert.AreEqual("ガ", words[6].Reading);
            Assert.AreEqual("タクサン", words[7].Reading);
            Assert.AreEqual("アリマス", words[8].Reading);
            Assert.AreEqual("。", words[9].Reading);

            Assert.AreEqual("ココラヘン", words[0].Pronunciation);
            Assert.AreEqual("ニ", words[1].Pronunciation);
            Assert.AreEqual("ワ", words[2].Pronunciation);
            Assert.AreEqual("ミル", words[3].Pronunciation);
            Assert.AreEqual("ベキ", words[4].Pronunciation);
            Assert.AreEqual("トコロ", words[5].Pronunciation);
            Assert.AreEqual("ガ", words[6].Pronunciation);
            Assert.AreEqual("タクサン", words[7].Pronunciation);
            Assert.AreEqual("アリマス", words[8].Pronunciation);
            Assert.AreEqual("。", words[9].Pronunciation);
        }