forked from aalhour/C-Sharp-Algorithms
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTrieTest.cs
142 lines (111 loc) · 4.58 KB
/
TrieTest.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
using System.Linq;
using System.Diagnostics;
using System.Collections.Generic;
using DataStructures.Trees;
using Xunit;
namespace UnitTest.DataStructuresTests
{
public static class TrieTest
{
[Fact]
public static void DoTest()
{
var trie = new Trie();
// Insert some how to words
var prefix_howTo = "How to make";
var word_howToSand = prefix_howTo + " a sandwitch";
var word_howToRobot = prefix_howTo + " a robot";
var word_howToOmelet = prefix_howTo + " an omelet";
var word_howToProp = prefix_howTo + " a proposal";
var listOfHow = new List<string>() { word_howToSand, word_howToRobot, word_howToOmelet, word_howToProp };
trie.Add(word_howToOmelet);
trie.Add(word_howToSand);
trie.Add(word_howToRobot);
trie.Add(word_howToProp);
// Count of words = 4
Assert.Equal(4, trie.Count);
// Insert some dictionary words
var prefix_act = "act";
var word_acts = prefix_act + "s";
var word_actor = prefix_act + "or";
var word_acting = prefix_act + "ing";
var word_actress = prefix_act + "ress";
var word_active = prefix_act + "ive";
var listOfActWords = new List<string>() { word_acts, word_actor, word_acting, word_actress, word_active };
trie.Add(word_actress);
trie.Add(word_active);
trie.Add(word_acting);
trie.Add(word_acts);
trie.Add(word_actor);
// Count of words = 9
Assert.Equal(9, trie.Count);
//
// ASSERT THE WORDS IN TRIE.
// Search for a word that doesn't exist
Assert.False(trie.ContainsWord(prefix_howTo));
// Search for prefix
Assert.True(trie.ContainsPrefix(prefix_howTo));
// Search for a prefix using a word
Assert.True(trie.ContainsPrefix(word_howToSand));
// Get all words that start with the how-to prefix
var someHowToWords = trie.SearchByPrefix(prefix_howTo).ToList();
Assert.Equal(someHowToWords.Count, listOfHow.Count);
// Assert there are only two words under the prefix "acti" -> active, & acting
var someActiWords = trie.SearchByPrefix("acti").ToList<string>();
Assert.True(someActiWords.Count == 2);
Assert.Contains(word_acting, someActiWords);
Assert.Contains(word_active, someActiWords);
// Assert that "acto" is not a word
Assert.False(trie.ContainsWord("acto"));
// Check the existance of other words
Assert.True(trie.ContainsWord(word_actress));
Assert.True(trie.ContainsWord(word_howToProp));
//
// TEST DELETING SOMETHINGS
// Removing a prefix should fail
var removing_acto_fails = false;
try
{
// try removing a non-terminal word
trie.Remove("acto");
removing_acto_fails = false;
}
catch
{
// if exception occured then code works, word doesn't exist.
removing_acto_fails = true;
}
Assert.True(removing_acto_fails);
Assert.True(trie.Count == 9);
// Removing a word should work
var removing_acting_passes = false;
try
{
// try removing a non-terminal word
trie.Remove(word_acting);
removing_acting_passes = true;
}
catch
{
// if exception occured then code DOESN'T work, word does exist.
removing_acting_passes = false;
}
Assert.True(removing_acting_passes);
Assert.True(trie.Count == 8);
someActiWords = trie.SearchByPrefix("acti").ToList<string>();
Assert.True(someActiWords.Count == 1);
Assert.Contains(word_active, someActiWords);
//
// TEST ENUMERATOR
var enumerator = trie.GetEnumerator();
var allWords = new List<string>();
while (enumerator.MoveNext())
allWords.Add(enumerator.Current);
// Assert size
Assert.True(allWords.Count == trie.Count);
// Assert each element
foreach (var word in allWords)
Debug.Assert(listOfActWords.Contains(word) || listOfHow.Contains(word));
}
}
}