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(); }