diff options
Diffstat (limited to 'src/unit/hash.unit')
-rw-r--r-- | src/unit/hash.unit | 378 |
1 files changed, 189 insertions, 189 deletions
diff --git a/src/unit/hash.unit b/src/unit/hash.unit index 3abc6a5..e30c62b 100644 --- a/src/unit/hash.unit +++ b/src/unit/hash.unit | |||
@@ -19,193 +19,193 @@ typedef Bu::Hash<int, Bu::String> IntStrHash; | |||
19 | 19 | ||
20 | suite Hash | 20 | suite Hash |
21 | { | 21 | { |
22 | test probe1 | 22 | test probe1 |
23 | { | 23 | { |
24 | StrIntHash h; | 24 | StrIntHash h; |
25 | char buf[20]; | 25 | char buf[20]; |
26 | for(int i=1;i<10000;i++) | 26 | for(int i=1;i<10000;i++) |
27 | { | 27 | { |
28 | sprintf(buf,"%d",i); | 28 | sprintf(buf,"%d",i); |
29 | Bu::String sTmp(buf); | 29 | Bu::String sTmp(buf); |
30 | h[sTmp] = i; | 30 | h[sTmp] = i; |
31 | unitTest( h.has(sTmp) ); | 31 | unitTest( h.has(sTmp) ); |
32 | } | 32 | } |
33 | } | 33 | } |
34 | 34 | ||
35 | test insert1 | 35 | test insert1 |
36 | { | 36 | { |
37 | StrIntHash h; | 37 | StrIntHash h; |
38 | h["Hi"] = 42; | 38 | h["Hi"] = 42; |
39 | unitTest( h["Hi"] == 42 ); | 39 | unitTest( h["Hi"] == 42 ); |
40 | } | 40 | } |
41 | 41 | ||
42 | test insert2 | 42 | test insert2 |
43 | { | 43 | { |
44 | StrStrHash h; | 44 | StrStrHash h; |
45 | h["Hi"] = "Yo"; | 45 | h["Hi"] = "Yo"; |
46 | h["Bye"] = "Later"; | 46 | h["Bye"] = "Later"; |
47 | unitTest( h["Hi"].getValue() == "Yo" ); | 47 | unitTest( h["Hi"].getValue() == "Yo" ); |
48 | 48 | ||
49 | StrStrHash h2(h); | 49 | StrStrHash h2(h); |
50 | unitTest( h2["Hi"].getValue() == "Yo" ); | 50 | unitTest( h2["Hi"].getValue() == "Yo" ); |
51 | unitTest( h2["Bye"].getValue() == "Later" ); | 51 | unitTest( h2["Bye"].getValue() == "Later" ); |
52 | 52 | ||
53 | StrStrHash h3; | 53 | StrStrHash h3; |
54 | h3 = h; | 54 | h3 = h; |
55 | unitTest( h3["Hi"].getValue() == "Yo" ); | 55 | unitTest( h3["Hi"].getValue() == "Yo" ); |
56 | unitTest( h3["Bye"].getValue() == "Later" ); | 56 | unitTest( h3["Bye"].getValue() == "Later" ); |
57 | } | 57 | } |
58 | 58 | ||
59 | test insert3 | 59 | test insert3 |
60 | { | 60 | { |
61 | IntStrHash h; | 61 | IntStrHash h; |
62 | 62 | ||
63 | for( unsigned int i=1; i<50; i++ ) | 63 | for( unsigned int i=1; i<50; i++ ) |
64 | { | 64 | { |
65 | h[i] = "testing"; | 65 | h[i] = "testing"; |
66 | unitTest( h.getSize() == i ); | 66 | unitTest( h.getSize() == i ); |
67 | } | 67 | } |
68 | } | 68 | } |
69 | 69 | ||
70 | test erase1 | 70 | test erase1 |
71 | { | 71 | { |
72 | StrIntHash h; | 72 | StrIntHash h; |
73 | h.insert("Number 1", 1 ); | 73 | h.insert("Number 1", 1 ); |
74 | h.insert("Number 2", 2 ); | 74 | h.insert("Number 2", 2 ); |
75 | h.insert("Number 3", 3 ); | 75 | h.insert("Number 3", 3 ); |
76 | h.erase("Number 2"); | 76 | h.erase("Number 2"); |
77 | h.get("Number 3"); | 77 | h.get("Number 3"); |
78 | try { | 78 | try { |
79 | h.get("Number 2"); | 79 | h.get("Number 2"); |
80 | unitFailed("h.get(\"Number 2\") should have thrown an exception."); | 80 | unitFailed("h.get(\"Number 2\") should have thrown an exception."); |
81 | } catch( Bu::HashException &e ) { } | 81 | } catch( Bu::HashException &e ) { } |
82 | 82 | ||
83 | /* printf("\n"); | 83 | /* printf("\n"); |
84 | for( StrIntHash::iterator i = h.begin(); i != h.end(); i++ ) | 84 | for( StrIntHash::iterator i = h.begin(); i != h.end(); i++ ) |
85 | { | 85 | { |
86 | printf(" - \"%s\" = %d\n", i.getKey().getStr(), i.getValue() ); | 86 | printf(" - \"%s\" = %d\n", i.getKey().getStr(), i.getValue() ); |
87 | } */ | 87 | } */ |
88 | } | 88 | } |
89 | 89 | ||
90 | test copy | 90 | test copy |
91 | { | 91 | { |
92 | StrIntHash h; | 92 | StrIntHash h; |
93 | h.insert("hello", 55 ); | 93 | h.insert("hello", 55 ); |
94 | h.insert("goodbye", -1812 ); | 94 | h.insert("goodbye", -1812 ); |
95 | 95 | ||
96 | StrIntHash h2 = h; | 96 | StrIntHash h2 = h; |
97 | unitTest( h2.isCoreShared( h ) ); | 97 | unitTest( h2.isCoreShared( h ) ); |
98 | 98 | ||
99 | StrIntHash h3 = h.clone(); | 99 | StrIntHash h3 = h.clone(); |
100 | unitTest( !h3.isCoreShared( h ) ); | 100 | unitTest( !h3.isCoreShared( h ) ); |
101 | } | 101 | } |
102 | 102 | ||
103 | test reHashSpecial | 103 | test reHashSpecial |
104 | { | 104 | { |
105 | IntStrHash hTest; | 105 | IntStrHash hTest; |
106 | 106 | ||
107 | setStepCount( 1000000 ); | 107 | setStepCount( 1000000 ); |
108 | for( int i=0; i<1000000; ++i ) | 108 | for( int i=0; i<1000000; ++i ) |
109 | { | 109 | { |
110 | char buf[40]; snprintf(buf,40,"num%d",i); | 110 | char buf[40]; snprintf(buf,40,"num%d",i); |
111 | incProgress(); | 111 | incProgress(); |
112 | 112 | ||
113 | if( ((double)random()/(double)RAND_MAX)<.01 ) | 113 | if( ((double)random()/(double)RAND_MAX)<.01 ) |
114 | { | 114 | { |
115 | //printf("ERASE: %d (%s)\n",i%64,buf); | 115 | //printf("ERASE: %d (%s)\n",i%64,buf); |
116 | hTest.erase(i%64); | 116 | hTest.erase(i%64); |
117 | } | 117 | } |
118 | else | 118 | else |
119 | { | 119 | { |
120 | hTest[i%64]=buf; | 120 | hTest[i%64]=buf; |
121 | } | 121 | } |
122 | 122 | ||
123 | /*printf("(%d) size: %u fill: %u cap:%u\n", | 123 | /*printf("(%d) size: %u fill: %u cap:%u\n", |
124 | i, | 124 | i, |
125 | hTest.getSize(), | 125 | hTest.getSize(), |
126 | hTest.getFill(), | 126 | hTest.getFill(), |
127 | hTest.getCapacity() | 127 | hTest.getCapacity() |
128 | );*/ | 128 | );*/ |
129 | } | 129 | } |
130 | } | 130 | } |
131 | 131 | ||
132 | test stress | 132 | test stress |
133 | { | 133 | { |
134 | srandom(time(NULL)); | 134 | srandom(time(NULL)); |
135 | 135 | ||
136 | IntStrHash hTest; | 136 | IntStrHash hTest; |
137 | IntStrHash hReUse; | 137 | IntStrHash hReUse; |
138 | setStepCount( 100000 ); | 138 | setStepCount( 100000 ); |
139 | 139 | ||
140 | for( int i=0; i<100000; ++i ) | 140 | for( int i=0; i<100000; ++i ) |
141 | { | 141 | { |
142 | char buf[40]; snprintf(buf,40,"num%d",i); | 142 | char buf[40]; snprintf(buf,40,"num%d",i); |
143 | hTest[i] = buf; | 143 | hTest[i] = buf; |
144 | incProgress(); | 144 | incProgress(); |
145 | 145 | ||
146 | 146 | ||
147 | if( ((double)random()/(double)RAND_MAX)<.01 ) | 147 | if( ((double)random()/(double)RAND_MAX)<.01 ) |
148 | { | 148 | { |
149 | Bu::List<int> lKeys = hReUse.getKeys(); | 149 | Bu::List<int> lKeys = hReUse.getKeys(); |
150 | Bu::List<int>::const_iterator it = lKeys.begin(); | 150 | Bu::List<int>::const_iterator it = lKeys.begin(); |
151 | int iIdx = (int)(((double)random()/(double)RAND_MAX) | 151 | int iIdx = (int)(((double)random()/(double)RAND_MAX) |
152 | *lKeys.getSize()); | 152 | *lKeys.getSize()); |
153 | for( int l=0; it; ++it, ++l ) | 153 | for( int l=0; it; ++it, ++l ) |
154 | { | 154 | { |
155 | if( l==iIdx ) | 155 | if( l==iIdx ) |
156 | { | 156 | { |
157 | int iVal = *it; | 157 | int iVal = *it; |
158 | hReUse.erase( *it ); | 158 | hReUse.erase( *it ); |
159 | char buf[40]; snprintf(buf,40,"num%d",iVal); | 159 | char buf[40]; snprintf(buf,40,"num%d",iVal); |
160 | hTest[i] = buf; | 160 | hTest[i] = buf; |
161 | //printf("re-use: %s\n",buf); | 161 | //printf("re-use: %s\n",buf); |
162 | } | 162 | } |
163 | } | 163 | } |
164 | } | 164 | } |
165 | 165 | ||
166 | /*printf("(%s) size: %u fill: %u cap:%u\n", | 166 | /*printf("(%s) size: %u fill: %u cap:%u\n", |
167 | buf, | 167 | buf, |
168 | hTest.getSize(), | 168 | hTest.getSize(), |
169 | hTest.getFill(), | 169 | hTest.getFill(), |
170 | hTest.getCapacity() | 170 | hTest.getCapacity() |
171 | );*/ | 171 | );*/ |
172 | 172 | ||
173 | if( ((double)random()/(double)RAND_MAX)<.3 ) | 173 | if( ((double)random()/(double)RAND_MAX)<.3 ) |
174 | { | 174 | { |
175 | Bu::List<int> lKeys = hTest.getKeys(); | 175 | Bu::List<int> lKeys = hTest.getKeys(); |
176 | int iIdx = (int)(((double)random()/(double)RAND_MAX) | 176 | int iIdx = (int)(((double)random()/(double)RAND_MAX) |
177 | *lKeys.getSize()); | 177 | *lKeys.getSize()); |
178 | Bu::List<int>::const_iterator it = lKeys.begin(); | 178 | Bu::List<int>::const_iterator it = lKeys.begin(); |
179 | for( int k=0; it; ++it, ++k ) | 179 | for( int k=0; it; ++it, ++k ) |
180 | { | 180 | { |
181 | if( k == iIdx ) | 181 | if( k == iIdx ) |
182 | { | 182 | { |
183 | hReUse.insert(*it,"yo"); | 183 | hReUse.insert(*it,"yo"); |
184 | hTest.erase( *it ); | 184 | hTest.erase( *it ); |
185 | } | 185 | } |
186 | } | 186 | } |
187 | } | 187 | } |
188 | 188 | ||
189 | if( hTest.getSize() > 100 ) | 189 | if( hTest.getSize() > 100 ) |
190 | { | 190 | { |
191 | int iK = (int)(((double)random()/(double)RAND_MAX)*50)+10; | 191 | int iK = (int)(((double)random()/(double)RAND_MAX)*50)+10; |
192 | for( int j=0; j<iK; ++j ) | 192 | for( int j=0; j<iK; ++j ) |
193 | { | 193 | { |
194 | Bu::List<int> lKeys = hTest.getKeys(); | 194 | Bu::List<int> lKeys = hTest.getKeys(); |
195 | int iIdx = (int)(((double)random()/(double)RAND_MAX) | 195 | int iIdx = (int)(((double)random()/(double)RAND_MAX) |
196 | *lKeys.getSize()); | 196 | *lKeys.getSize()); |
197 | Bu::List<int>::const_iterator it = lKeys.begin(); | 197 | Bu::List<int>::const_iterator it = lKeys.begin(); |
198 | for( int k=0; it; ++it, ++k ) | 198 | for( int k=0; it; ++it, ++k ) |
199 | { | 199 | { |
200 | if( k == iIdx ) | 200 | if( k == iIdx ) |
201 | { | 201 | { |
202 | hReUse.insert(*it,"yo"); | 202 | hReUse.insert(*it,"yo"); |
203 | hTest.erase( *it ); | 203 | hTest.erase( *it ); |
204 | break; | 204 | break; |
205 | } | 205 | } |
206 | } | 206 | } |
207 | } | 207 | } |
208 | } | 208 | } |
209 | } | 209 | } |
210 | } | 210 | } |
211 | } | 211 | } |