1// tmapped.cpp -- Regression test program, mapped view tests 2// $Id: tmapped.cpp 1230 2007-03-09 15:58:53Z jcw $ 3// This is part of Metakit, the homepage is http://www.equi4.com/metakit.html 4 5#include "regress.h" 6 7void TestBlockDel(int pos_, int len_) { 8 printf("blockdel pos %d len %d\n", pos_, len_); 9 10 c4_ViewProp p1("_B"); 11 c4_IntProp p2("p2"); 12 13 c4_Storage s1; 14 c4_View v1 = s1.GetAs("v1[_B[p2:I]]"); 15 16 int n = 0; 17 static int sizes[] = { 18 999, 999, 999, 2, 0 19 }; 20 21 for (int i = 0; sizes[i]; ++i) { 22 c4_View v; 23 v.SetSize(sizes[i]); 24 for (int j = 0; j < sizes[i]; ++j) 25 p2(v[j]) = ++n; 26 v1.Add(p1[v]); 27 } 28 29 c4_View v2 = v1.Blocked(); 30 A(v2.GetSize() == 2999); 31 32 v2.RemoveAt(pos_, len_); 33 A(v2.GetSize() == 2999-len_); 34} 35 36void TestMapped() { 37 B(m01, Hash mapping, 0); 38 { 39 c4_StringProp p1("p1"); 40 41 c4_Storage s1; 42 c4_View v1 = s1.GetAs("v1[p1:S]"); 43 c4_View v2 = s1.GetAs("v2[_H:I,_R:I]"); 44 c4_View v3 = v1.Hash(v2, 1); 45 46 v3.Add(p1["b93655249726e5ef4c68e45033c2e0850570e1e07"]); 47 v3.Add(p1["2ab03fba463d214f854a71ab5c951cea096887adf"]); 48 v3.Add(p1["2e196eecb91b02c16c23360d8e1b205f0b3e3fa3d"]); 49 A(v3.GetSize() == 3); 50 51 // infinite loop in 2.4.0, reported by Nathan Rogers, July 2001 52 // happens when looking for missing key after a hash collision 53 int f = v3.Find(p1["7c0734c9187133f34588517fb5b39294076f22ba3"]); 54 A(f == - 1); 55 } 56 E; 57 58 // example from Steve Baxter, Nov 2001, after block perf bugfix 59 // assertion failure on row 1001, due to commit data mismatch 60 B(m02, Blocked view bug, 0)W(m02a); 61 { 62 c4_BytesProp p1("p1"); 63 c4_Bytes h; 64 65 c4_Storage s1("m02a", true); 66 c4_View v1 = s1.GetAs("v1[_B[p1:B]]"); 67 c4_View v2 = v1.Blocked(); 68 69 for (int i = 0; i < 1005; ++i) { 70 h.SetBuffer(2500+i); 71 v2.Add(p1[h]); 72 73 if (i >= 999) 74 // will crash a few rounds later, at row 1001 75 s1.Commit(); 76 } 77 78 // reduce size to shorten the dump output 79 v2.RemoveAt(0, 990); 80 s1.Commit(); 81 82 } 83 D(m02a); 84 R(m02a); 85 E; 86 87 B(m03, Hash adds, 0)W(m03a); 88 { 89 c4_StringProp p1("p1"); 90 91 c4_Storage s1("m03a", true); 92 93 c4_View d1 = s1.GetAs("d1[p1:S]"); 94 c4_View m1 = s1.GetAs("m1[_H:I,_R:I]"); 95 c4_View h1 = d1.Hash(m1); 96 97 h1.Add(p1["one"]); 98 s1.Commit(); 99 100 c4_View d2 = s1.GetAs("d2[p1:S]"); 101 c4_View m2 = s1.GetAs("m2[_H:I,_R:I]"); 102 c4_View h2 = d2.Hash(m2); 103 104 h1.Add(p1["two"]); 105 h2.Add(p1["two"]); 106 s1.Commit(); 107 108 c4_View d3 = s1.GetAs("d3[p1:S]"); 109 c4_View m3 = s1.GetAs("m3[_H:I,_R:I]"); 110 c4_View h3 = d3.Hash(m3); 111 112 h1.Add(p1["three"]); 113 h2.Add(p1["three"]); 114 h3.Add(p1["three"]); 115 s1.Commit(); 116 117 c4_View d4 = s1.GetAs("d4[p1:S]"); 118 c4_View m4 = s1.GetAs("m4[_H:I,_R:I]"); 119 c4_View h4 = d4.Hash(m4); 120 121 h1.Add(p1["four"]); 122 h2.Add(p1["four"]); 123 h3.Add(p1["four"]); 124 h4.Add(p1["four"]); 125 s1.Commit(); 126 127 } 128 D(m03a); 129 R(m03a); 130 E; 131 132 B(m04, Locate bug, 0)W(m04a); 133 { 134 c4_IntProp p1("p1"); 135 c4_StringProp p2("p2"); 136 137 c4_Storage s1("m04a", true); 138 s1.AutoCommit(); 139 140 c4_View v1 = s1.GetAs("v1[p1:I,p2:S]"); 141 142 v1.Add(p1[1] + p2["one"]); 143 v1.Add(p1[2] + p2["two"]); 144 v1.Add(p1[3] + p2["three"]); 145 s1.Commit(); 146 147 c4_View v2 = v1.Ordered(); 148 A(v2.GetSize() == 3); 149 v2.Add(p1[6] + p2["six"]); 150 v2.Add(p1[5] + p2["five"]); 151 v2.Add(p1[4] + p2["four"]); 152 A(v2.GetSize() == 6); 153 A(v1.GetSize() == 6); 154 155 A(p1(v1[0]) == 1); 156 A(p1(v1[1]) == 2); 157 A(p1(v1[2]) == 3); 158 A(p1(v1[3]) == 4); 159 A(p1(v1[4]) == 5); 160 A(p1(v1[5]) == 6); 161 162 A(v2.Find(p1[4]) == 3); 163 A(v2.Search(p1[4]) == 3); 164 165 int i1 = - 1; 166 A(v1.Locate(p1[4], &i1) == 1); 167 A(i1 == 3); 168 169 int i2 = - 1; 170 A(v2.Locate(p1[4], &i2) == 1); 171 A(i2 == 3); 172 173 } 174 D(m04a); 175 R(m04a); 176 E; 177 178 // subviews are not relocated properly with blocked views in 2.4.7 179 B(m05, Blocked view with subviews, 0)W(m05a); 180 { 181 char buf[10]; 182 c4_StringProp p1("p1"); 183 c4_IntProp p2("p2"); 184 c4_ViewProp pSv("sv"); 185 186 c4_Storage s1("m05a", true); 187 c4_View v1 = s1.GetAs("v1[_B[p1:S,sv[p2:I]]]"); 188 c4_View v2 = v1.Blocked(); 189 190 for (int i = 0; i < 1000; ++i) { 191 sprintf(buf, "id-%d", i); 192 v2.Add(p1[buf]); 193 194 c4_View v3 = pSv(v2[i]); 195 v3.Add(p2[i]); 196 } 197 198 for (int j = 0; j < 1; ++j) { 199 sprintf(buf, "insert-%d", j); 200 v2.InsertAt(500, p1[buf]); 201 } 202 203 s1.Commit(); 204 205 } 206 D(m05a); 207 R(m05a); 208 E; 209 210 // 2003/02/14 - assert fails for 2.4.8 in c4_Column::RemoveData 211 B(m06, Blocked view multi-row deletion, 0)W(m06a); 212 { 213 c4_IntProp p1("p1"); 214 215 c4_Storage s1("m06a", true); 216 c4_View v1 = s1.GetAs("v1[p1:I]"); 217 c4_View v2 = s1.GetAs("v2[_B[_H:I,_R:I]]"); 218 c4_View v3 = v2.Blocked(); 219 c4_View v4 = v1.Hash(v3, 1); 220 221 v4.Add(p1[1]); 222 v4.Add(p1[2]); 223 v4.RemoveAt(1); 224 225 for (int i = 100; i < 1000; ++i) { 226 v4.Add(p1[i]); 227 } 228 229 s1.Commit(); 230 231 } 232 D(m06a); 233 R(m06a); 234 E; 235 236 // 2003/03/07 - still not correct on blocked veiw deletions 237 B(m07, All blocked view multi-deletion cases, 0); 238 { 239 int i, j; 240 for (i = 0; i < 2; ++i) { 241 for (j = 1; j < 4; ++j) 242 TestBlockDel(i, j); 243 for (j = 998; j < 1002; ++j) 244 TestBlockDel(i, j); 245 for (j = 1998; j < 2002; ++j) 246 TestBlockDel(i, j); 247 } 248 for (i = 998; i < 1002; ++i) { 249 for (j = 1; j < 4; ++j) 250 TestBlockDel(i, j); 251 for (j = 998; j < 1002; ++j) 252 TestBlockDel(i, j); 253 } 254 for (i = 1; i < 4; ++i) 255 TestBlockDel(2999-i, i); 256 for (i = 998; i < 1002; ++i) 257 TestBlockDel(2999-i, i); 258 for (i = 1998; i < 2002; ++i) 259 TestBlockDel(2999-i, i); 260 } 261 E; 262} 263