public void LoadWordsFromFile_DisposeCalledOnException()
        {
            IStreamReader          mockStreamReader   = mockery.NewMock <IStreamReader>();
            ICharacterTrieBuilder  mockTrieBuilder    = mockery.NewMock <ICharacterTrieBuilder>();
            Func <String, Boolean> wordFilterFunction = new Func <String, Boolean>((inputString) => { return(true); });

            using (mockery.Ordered)
            {
                Expect.Once.On(mockStreamReader).GetProperty("EndOfStream").Will(Return.Value(false));
                Expect.Once.On(mockStreamReader).Method("ReadLine").WithNoArguments().Will(Throw.Exception(new Exception("Test Exception")));
                Expect.Once.On(mockStreamReader).Method("Dispose").WithNoArguments();
            }

            Exception e = Assert.ThrowsException <Exception>(() =>
            {
                testDataStructureUtilities.LoadWordsFromFile(trieRoot, mockStreamReader, mockTrieBuilder, wordFilterFunction);
            });

            mockery.VerifyAllExpectationsHaveBeenMet();
        }
        public void PopulateAdjacentWordDataStructures_DisposeCalledOnException()
        {
            IStreamReader         mockStreamReader         = mockery.NewMock <IStreamReader>();
            ICharacterTrieBuilder mockTrieBuilder          = mockery.NewMock <ICharacterTrieBuilder>();
            HashSet <String>      allWords                 = new HashSet <String>();
            FrequencyTable <Char> fromCharacterFrequencies = new FrequencyTable <Char>();
            FrequencyTable <CharacterSubstitution> characterSubstitutionFrequencies = new FrequencyTable <CharacterSubstitution>();
            Func <String, Boolean> wordFilterFunction = new Func <String, Boolean>((inputString) => { return(true); });

            using (mockery.Ordered)
            {
                Expect.Once.On(mockStreamReader).GetProperty("EndOfStream").Will(Return.Value(false));
                Expect.Once.On(mockStreamReader).Method("ReadLine").WithNoArguments().Will(Throw.Exception(new Exception("Test Exception")));
                Expect.Once.On(mockStreamReader).Method("Dispose").WithNoArguments();
            }

            Exception e = Assert.ThrowsException <Exception>(() =>
            {
                testDataStructureUtilities.PopulateAdjacentWordDataStructures(mockStreamReader, mockTrieBuilder, wordFilterFunction, trieRoot, allWords, fromCharacterFrequencies, characterSubstitutionFrequencies);
            });

            mockery.VerifyAllExpectationsHaveBeenMet();
        }
        /// <summary>
        /// Reads a set of words from a stream, and adds the words and statistics pertaining to the words to a set of data structures.
        /// </summary>
        /// <param name="reader">The stream reader to used to read the set of words (allows specifying a mocked reader for unit testing).</param>
        /// <param name="trieBuilder">The trie builder to use to add the words to the trie (allows specifying a mocked builder for unit testing).</param>
        /// <param name="wordFilterFunction">A Func to filter whether or not the specified word should be added to the trie.  Accepts the word as a parameter, and returns a bookean indicating whether that word should be added to the trie.</param>
        /// <param name="allWordsTrieRoot">The root of a character trie to populate with the words.</param>
        /// <param name="allWords">A HashSet to populate with the words.</param>
        /// <param name="fromCharacterFrequencies">A FrequencyTable to populate with the number of times each character is the 'from' character in a substitution.</param>
        /// <param name="characterSubstitutionFrequencies">A FrequencyTable to populate with the number of times each pair of characters in a substitution occur.</param>
        public void PopulateAdjacentWordDataStructures(IStreamReader reader, ICharacterTrieBuilder trieBuilder, Func <String, Boolean> wordFilterFunction, Dictionary <Char, TrieNode <Char> > allWordsTrieRoot, HashSet <String> allWords, FrequencyTable <Char> fromCharacterFrequencies, FrequencyTable <CharacterSubstitution> characterSubstitutionFrequencies)
        {
            // Read all words and add them to the HashSet and trie
            using (reader)
            {
                while (reader.EndOfStream == false)
                {
                    String currentWord = reader.ReadLine();
                    if (wordFilterFunction.Invoke(currentWord) == true)
                    {
                        if (allWords.Contains(currentWord) == false)
                        {
                            allWords.Add(currentWord);
                            trieBuilder.AddWord(allWordsTrieRoot, currentWord, true);
                        }
                    }
                }
            }

            // Populate the frequency tables
            CharacterTrieUtilities trieUtilities = new CharacterTrieUtilities();
            WordUtilities          wordUtilities = new WordUtilities();

            foreach (String currentWord in allWords)
            {
                foreach (String adjacentWord in trieUtilities.FindAdjacentWords(allWordsTrieRoot, currentWord))
                {
                    // Find the character which was substitued between the word and the adjacent word
                    Tuple <Char, Char> differingCharacters = wordUtilities.FindDifferingCharacters(currentWord, adjacentWord);
                    Char fromCharacter = differingCharacters.Item1, toCharacter = differingCharacters.Item2;

                    // Increment the data structures
                    fromCharacterFrequencies.Increment(fromCharacter);
                    characterSubstitutionFrequencies.Increment(new CharacterSubstitution(fromCharacter, toCharacter));
                }
            }
        }
        public void LoadWordsFromFile()
        {
            IStreamReader         mockStreamReader = mockery.NewMock <IStreamReader>();
            ICharacterTrieBuilder mockTrieBuilder  = mockery.NewMock <ICharacterTrieBuilder>();
            List <String>         testWords        = new List <String>()
            {
                "time", "cat", "tile", "birds", "take"
            };
            Func <String, Boolean> wordFilterFunction = new Func <String, Boolean>((inputString) =>
            {
                if (inputString.Length == 4)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            });

            using (mockery.Ordered)
            {
                foreach (String currentTestWord in testWords)
                {
                    Expect.Once.On(mockStreamReader).GetProperty("EndOfStream").Will(Return.Value(false));
                    Expect.Once.On(mockStreamReader).Method("ReadLine").WithNoArguments().Will(Return.Value(currentTestWord));
                    if (currentTestWord.Length == 4)
                    {
                        Expect.Once.On(mockTrieBuilder).Method("AddWord").With(trieRoot, currentTestWord, true);
                    }
                }
                Expect.Once.On(mockStreamReader).GetProperty("EndOfStream").Will(Return.Value(true));
                Expect.Once.On(mockStreamReader).Method("Dispose").WithNoArguments();
            }

            testDataStructureUtilities.LoadWordsFromFile(trieRoot, mockStreamReader, mockTrieBuilder, wordFilterFunction);
        }
 /// <summary>
 /// Reads a set of words from a stream, and adds them to the trie with the specified root.
 /// </summary>
 /// <param name="trieRoot">The root of the trie.</param>
 /// <param name="reader">The stream reader to used to read the set of words (allows specifying a mocked reader for unit testing).</param>
 /// <param name="trieBuilder">The trie builder to use to add the words to the trie (allows specifying a mocked builder for unit testing).</param>
 /// <param name="wordFilterFunction">A Func to filter whether or not the specified word should be added to the trie.  Accepts the word as a parameter, and returns a bookean indicating whether that word should be added to the trie.</param>
 public void LoadWordsFromFile(Dictionary <Char, TrieNode <Char> > trieRoot, IStreamReader reader, ICharacterTrieBuilder trieBuilder, Func <String, Boolean> wordFilterFunction)
 {
     using (reader)
     {
         while (reader.EndOfStream == false)
         {
             String currentWord = reader.ReadLine();
             if (wordFilterFunction.Invoke(currentWord) == true)
             {
                 trieBuilder.AddWord(trieRoot, currentWord, true);
             }
         }
     }
 }
 /// <summary>
 /// Initialises a new instance of the Algorithms.UnitTests.DataStructureUtilitiesTests+AddWordToCharacterTrieActionAction class.
 /// </summary>
 /// <param name="characterTrieBuilder">An implementation of ICharacterTrieBuilder to use to add the word to the trie.</param>
 /// <param name="trieRoot">The root of the trie.</param>
 /// <param name="word">The word to add to the trie.</param>
 public AddWordToCharacterTrieActionAction(ICharacterTrieBuilder characterTrieBuilder, Dictionary <Char, TrieNode <Char> > trieRoot, String word)
 {
     this.characterTrieBuilder = characterTrieBuilder;
     this.trieRoot             = trieRoot;
     this.word = word;
 }
        public void PopulateAdjacentWordDataStructures()
        {
            IStreamReader         mockStreamReader         = mockery.NewMock <IStreamReader>();
            ICharacterTrieBuilder mockTrieBuilder          = mockery.NewMock <ICharacterTrieBuilder>();
            HashSet <String>      allWords                 = new HashSet <String>();
            FrequencyTable <Char> fromCharacterFrequencies = new FrequencyTable <Char>();
            FrequencyTable <CharacterSubstitution> characterSubstitutionFrequencies = new FrequencyTable <CharacterSubstitution>();
            List <String> testWords = new List <String>()
            {
                "read",
                "bead",
                "fail",
                "dead",
                "road",
                "reed",
                "calm",
                "real",
                "rear"
            };
            Func <String, Boolean> wordFilterFunction = new Func <String, Boolean>((inputString) =>
            {
                if (inputString.Length == 4)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            });

            using (mockery.Ordered)
            {
                foreach (String currentTestWord in testWords)
                {
                    Expect.Once.On(mockStreamReader).GetProperty("EndOfStream").Will(Return.Value(false));
                    Expect.Once.On(mockStreamReader).Method("ReadLine").WithNoArguments().Will(Return.Value(currentTestWord));
                    // Invoking of action AddWordToCharacterTrieActionAction adds the test word to the trie (since this will not be done by the 'mockTrieBuilder')
                    Expect.Once.On(mockTrieBuilder).Method("AddWord").With(trieRoot, currentTestWord, true).Will(new AddWordToCharacterTrieActionAction(new CharacterTrieBuilder(), trieRoot, currentTestWord));
                }
                Expect.Once.On(mockStreamReader).GetProperty("EndOfStream").Will(Return.Value(true));
                Expect.Once.On(mockStreamReader).Method("Dispose").WithNoArguments();
            }

            testDataStructureUtilities.PopulateAdjacentWordDataStructures(mockStreamReader, mockTrieBuilder, wordFilterFunction, trieRoot, allWords, fromCharacterFrequencies, characterSubstitutionFrequencies);

            Assert.AreEqual(1, characterSubstitutionFrequencies.GetFrequency(new CharacterSubstitution('a', 'e')));
            Assert.AreEqual(1, characterSubstitutionFrequencies.GetFrequency(new CharacterSubstitution('b', 'd')));
            Assert.AreEqual(1, characterSubstitutionFrequencies.GetFrequency(new CharacterSubstitution('b', 'r')));
            Assert.AreEqual(1, characterSubstitutionFrequencies.GetFrequency(new CharacterSubstitution('d', 'b')));
            Assert.AreEqual(1, characterSubstitutionFrequencies.GetFrequency(new CharacterSubstitution('d', 'l')));
            Assert.AreEqual(2, characterSubstitutionFrequencies.GetFrequency(new CharacterSubstitution('d', 'r')));
            Assert.AreEqual(1, characterSubstitutionFrequencies.GetFrequency(new CharacterSubstitution('e', 'a')));
            Assert.AreEqual(1, characterSubstitutionFrequencies.GetFrequency(new CharacterSubstitution('e', 'o')));
            Assert.AreEqual(1, characterSubstitutionFrequencies.GetFrequency(new CharacterSubstitution('l', 'd')));
            Assert.AreEqual(1, characterSubstitutionFrequencies.GetFrequency(new CharacterSubstitution('l', 'r')));
            Assert.AreEqual(1, characterSubstitutionFrequencies.GetFrequency(new CharacterSubstitution('o', 'e')));
            Assert.AreEqual(1, characterSubstitutionFrequencies.GetFrequency(new CharacterSubstitution('r', 'b')));
            Assert.AreEqual(2, characterSubstitutionFrequencies.GetFrequency(new CharacterSubstitution('r', 'd')));
            Assert.AreEqual(1, characterSubstitutionFrequencies.GetFrequency(new CharacterSubstitution('r', 'l')));
            Assert.AreEqual(14, characterSubstitutionFrequencies.ItemCount);
            Assert.AreEqual(1, fromCharacterFrequencies.GetFrequency('a'));
            Assert.AreEqual(2, fromCharacterFrequencies.GetFrequency('b'));
            Assert.AreEqual(4, fromCharacterFrequencies.GetFrequency('d'));
            Assert.AreEqual(2, fromCharacterFrequencies.GetFrequency('e'));
            Assert.AreEqual(2, fromCharacterFrequencies.GetFrequency('l'));
            Assert.AreEqual(1, fromCharacterFrequencies.GetFrequency('o'));
            Assert.AreEqual(4, fromCharacterFrequencies.GetFrequency('r'));
            Assert.AreEqual(7, fromCharacterFrequencies.ItemCount);
            mockery.VerifyAllExpectationsHaveBeenMet();
        }