public void T_GetNext_SimpleLongChain()
        {
            ChainGenerator chainGenerator = TestUtils.Create2WordGen(_simpleSentence);
            WordGenerator  wordGenerator  = InitSimpleWordGen();

            wordGenerator.ResetSubchains(new ChainCondition(ck => ck.Words[0] == null && ck.Words[1] == null), null);

            chainGenerator.GenerateChains();
            ChainMap origChains = chainGenerator.Chains;

            StringBuilder sb = new StringBuilder();

            sb.Append(wordGenerator.CurrentWord);
            for (int i = 0; i < 200; i++)
            {
                sb.Append(" ");
                sb.Append(wordGenerator.GetNextWord());
            }

            chainGenerator = TestUtils.Create2WordGen(sb.ToString());
            chainGenerator.GenerateChains();
            ChainMap resultChains = chainGenerator.Chains;

            //When we get to the end we should start from the beginning
            origChains.AddToChain(new ChainKey(new string[] { "two", "?" }), "hello");
            origChains.AddToChain(new ChainKey(new string[] { "?", "hello" }), "world");

            TestUtils.CompareChainTablesNoDuplicates(origChains, resultChains);
        }
        /// <summary>
        /// Create a word generator with constant Random seed
        /// </summary>
        /// <returns></returns>
        private WordGenerator InitSimpleWordGen()
        {
            ChainGenerator chainGen =
                new ChainGenerator(_simpleSentence, TestUtils.StandardDelims.ToArray(), 2);

            chainGen.GenerateChains();
            return(new WordGenerator(chainGen.Chains, new Random(1000)));
        }
        public void T_Chains_2()
        {
            ChainGenerator chainGenerator = new ChainGenerator(_advancedChainString, _delims, 2);

            chainGenerator.GenerateChains();

            Dictionary <ChainKey, List <string> > correctChains =
                new Dictionary <ChainKey, List <string> > {
                { new ChainKey(new string[] { null, null }), new List <string> {
                      "words"
                  } },
                { new ChainKey(new string[] { null, "words" }), new List <string> {
                      "from"
                  } },
                { new ChainKey(new string[] { "words", "from" }), new List <string> {
                      ".", "sentence"
                  } },
                { new ChainKey(new string[] { "from", "." }), new List <string> {
                      "sentence"
                  } },
                { new ChainKey(new string[] { ".", "sentence" }), new List <string> {
                      ","
                  } },
                { new ChainKey(new string[] { "sentence", "," }), new List <string> {
                      "will"
                  } },
                { new ChainKey(new string[] { ",", "will" }), new List <string> {
                      "never"
                  } },
                { new ChainKey(new string[] { "will", "never" }), new List <string> {
                      "end"
                  } },
                { new ChainKey(new string[] { "never", "end" }), new List <string> {
                      "?"
                  } },
                { new ChainKey(new string[] { "end", "?" }), new List <string> {
                      "because"
                  } },
                { new ChainKey(new string[] { "?", "because" }), new List <string> {
                      "words"
                  } },
                { new ChainKey(new string[] { "because", "words" }), new List <string> {
                      "from"
                  } },
                { new ChainKey(new string[] { "from", "sentence" }), new List <string> {
                      "is"
                  } },
                { new ChainKey(new string[] { "sentence", "is" }), new List <string> {
                      "good"
                  } },
                { new ChainKey(new string[] { "is", "good" }), new List <string> {
                      "."
                  } }
            };

            TestUtils.CompareChainTables(chainGenerator.Chains, correctChains);
        }