1// tstore3.cpp -- Regression test program, storage tests, part 3 2// $Id: tstore3.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 TestStores3() { 8 B(s20, View outlives storage, 0)W(s20a); 9 { 10 c4_IntProp p1("p1"); 11 c4_View v1; 12 13 { 14 c4_Storage s1("s20a", 1); 15 v1 = s1.GetAs("a[p1:I,p2:S]"); 16 v1.Add(p1[123]); 17 } 18 19 // 19990916 - semantics changed, rows kept but no properties 20 //A(p1 (v1[0]) == 123); 21 A(v1.GetSize() == 1); 22 A(v1.NumProperties() == 0); 23 24 } 25 D(s20a); 26 R(s20a); 27 E; 28 29 B(s21, Test demo scenario, 0)W(s21a); 30 { 31 c4_StringProp p1("p1"), p2("p2"); 32 { 33 c4_Storage storage("s21a", 1); 34 storage.SetStructure("a[p1:S,p2:S]"); 35 c4_View v1; 36 c4_Row r1; 37 38 p1(r1) = "One"; 39 p2(r1) = "Un"; 40 v1.Add(r1); 41 A(v1.GetSize() == 1); 42 43 p1(r1) = "Two"; 44 p2(r1) = "Deux"; 45 v1.Add(r1); 46 A(v1.GetSize() == 2); 47 48 // changed 2000-03-15: Store is gone 49 //v1 = storage.Store("a", v1); 50 v1 = storage.View("a") = v1; 51 52 A(v1.GetSize() == 2); 53 A(p1(v1[1]) == (c4_String)"Two"); 54 A(p2(v1[1]) == (c4_String)"Deux"); 55 A(p1(v1[0]) == (c4_String)"One"); 56 A(p2(v1[0]) == (c4_String)"Un"); 57 58 storage.Commit(); 59 A(v1.GetSize() == 2); 60 A(p1(v1[1]) == (c4_String)"Two"); 61 A(p2(v1[1]) == (c4_String)"Deux"); 62 A(p1(v1[0]) == (c4_String)"One"); 63 A(p2(v1[0]) == (c4_String)"Un"); 64 65 c4_String s1(p1(v1[1])); 66 c4_String s2(p2(v1[1])); 67 A(s1 == "Two"); 68 A(s2 == "Deux"); 69 70 storage.Commit(); 71 72 v1.Add(p1["Three"] + p2["Trois"]); 73 74 storage.Commit(); 75 A(v1.GetSize() == 3); 76 A(p2(v1[2]) == (c4_String)"Trois"); 77 78 v1 = storage.GetAs("a[p1:S,p2:S,p3:I]"); 79 A(v1.GetSize() == 3); 80 A(p2(v1[2]) == (c4_String)"Trois"); 81 82 c4_IntProp p3("p3"); 83 p3(v1[1]) = 123; 84 85 storage.Commit(); 86 A(v1.GetSize() == 3); 87 A(p2(v1[2]) == (c4_String)"Trois"); 88 89 c4_View v2 = storage.GetAs("b[p4:I]"); 90 91 c4_IntProp p4("p4"); 92 v2.Add(p4[234]); 93 94 storage.Commit(); 95 A(v1.GetSize() == 3); 96 A(p2(v1[2]) == (c4_String)"Trois"); 97 98 c4_IntProp p4a("p4"); 99 v1.InsertAt(2, p1["Four"] + p4a[345]); 100 101 storage.Commit(); 102 A(v1.GetSize() == 4); 103 A(p1(v1[0]) == (c4_String)"One"); 104 A(p1(v1[1]) == (c4_String)"Two"); 105 A(p1(v1[2]) == (c4_String)"Four"); 106 A(p1(v1[3]) == (c4_String)"Three"); 107 A(p2(v1[3]) == (c4_String)"Trois"); 108 A(v2.GetSize() == 1); 109 A(p4(v2[0]) == 234); 110 } 111 { 112 c4_Storage storage("s21a", 0); 113 c4_View v1 = storage.View("a"); 114 A(v1.GetSize() == 4); 115 A(p1(v1[0]) == (c4_String)"One"); 116 A(p1(v1[1]) == (c4_String)"Two"); 117 A(p1(v1[2]) == (c4_String)"Four"); 118 A(p1(v1[3]) == (c4_String)"Three"); 119 c4_View v2 = storage.View("b"); 120 c4_IntProp p4("p4"); 121 A(v2.GetSize() == 1); 122 A(p4(v2[0]) == 234); 123 } 124 } 125 D(s21a); 126 R(s21a); 127 E; 128 129#if !q4_TINY 130 B(s22, Double storage, 0)W(s22a); 131 { 132 c4_DoubleProp p1("p1"); 133 c4_Storage s1("s22a", 1); 134 s1.SetStructure("a[p1:D]"); 135 c4_View v1 = s1.View("a"); 136 v1.Add(p1[1234.5678]); 137 v1.Add(p1[2345.6789]); 138 v1.InsertAt(1, p1[3456.7890]); 139 s1.Commit(); 140 } 141 D(s22a); 142 R(s22a); 143 E; 144#endif 145 146 B(s23, Find absent record, 0)W(s23a); 147 { 148 c4_Storage s1("s23a", 1); 149 s1.SetStructure("v[h:S,p:I,a:I,b:I,c:I,d:I,e:I,f:I,g:I,x:I]"); 150 c4_View view = s1.View("v"); 151 152 c4_StringProp H("h"); 153 c4_IntProp P("p"); 154 155 c4_Row row; 156 H(row) = "someString"; 157 P(row) = 99; 158 159 int x = view.Find(row); 160 A(x == - 1); 161 162 } 163 D(s23a); 164 R(s23a); 165 E; 166 167 B(s24, Bitwise storage, 0)W(s24a); 168 { 169 c4_IntProp p1("p1"); 170 171 int m = 9; 172 173 // insert values in front, but check fractional sizes at each step 174 for (int n = 0; n < m; ++n) { 175 { 176 c4_Storage s1("s24a", 1); 177 s1.SetStructure("a1[p1:I],a2[p1:I],a3[p1:I],a4[p1:I]"); 178 s1.AutoCommit(); // new feature in 1.6 179 180 c4_View v1 = s1.View("a1"); 181 c4_View v2 = s1.View("a2"); 182 c4_View v3 = s1.View("a3"); 183 c4_View v4 = s1.View("a4"); 184 185 c4_Row row; 186 int k = ~n; 187 188 p1(row) = k &0x01; 189 v1.InsertAt(0, row); 190 191 p1(row) = k &0x03; 192 v2.InsertAt(0, row); 193 194 p1(row) = k &0x0F; 195 v3.InsertAt(0, row); 196 197 p1(row) = k &0x7F; 198 v4.InsertAt(0, row); 199 } 200 // the following checks that all tiny size combinations work 201 { 202 c4_Storage s1("s24a", 0); 203 204 c4_View v1 = s1.View("a1"); 205 c4_View v2 = s1.View("a2"); 206 c4_View v3 = s1.View("a3"); 207 c4_View v4 = s1.View("a4"); 208 209 A(v1.GetSize() == n + 1); 210 A(v2.GetSize() == n + 1); 211 A(v3.GetSize() == n + 1); 212 A(v4.GetSize() == n + 1); 213 } 214 } 215 216 c4_Storage s1("s24a", 0); 217 218 c4_View v1 = s1.View("a1"); 219 c4_View v2 = s1.View("a2"); 220 c4_View v3 = s1.View("a3"); 221 c4_View v4 = s1.View("a4"); 222 223 A(v1.GetSize() == m); 224 A(v2.GetSize() == m); 225 A(v3.GetSize() == m); 226 A(v4.GetSize() == m); 227 228 // now check that the inserted values are correct 229 for (int i = 0; i < m; ++i) { 230 int j = m - i - 1; 231 int k = ~i; 232 233 A(p1(v1[j]) == (k &0x01)); 234 A(p1(v2[j]) == (k &0x03)); 235 A(p1(v3[j]) == (k &0x0F)); 236 A(p1(v4[j]) == (k &0x7F)); 237 } 238 239 } 240 D(s24a); 241 R(s24a); 242 E; 243 244 B(s25, Bytes storage, 0)W(s25a); 245 { 246 c4_Bytes hi("hi", 2); 247 c4_Bytes gday("gday", 4); 248 c4_Bytes hello("hello", 5); 249 250 c4_BytesProp p1("p1"); 251 c4_Storage s1("s25a", 1); 252 s1.SetStructure("a[p1:B]"); 253 c4_View v1 = s1.View("a"); 254 255 v1.Add(p1[hi]); 256 A(p1(v1[0]) == hi); 257 v1.Add(p1[hello]); 258 A(p1(v1[0]) == hi); 259 A(p1(v1[1]) == hello); 260 v1.InsertAt(1, p1[gday]); 261 A(p1(v1[0]) == hi); 262 A(p1(v1[1]) == gday); 263 A(p1(v1[2]) == hello); 264 s1.Commit(); 265 A(p1(v1[0]) == hi); 266 A(p1(v1[1]) == gday); 267 A(p1(v1[2]) == hello); 268 269 } 270 D(s25a); 271 R(s25a); 272 E; 273 274 B(s26, Bitwise autosizing, 0)W(s26a); 275 { 276 c4_IntProp p1("p1"), p2("p2"), p3("p3"), p4("p4"); 277 c4_Storage s1("s26a", 1); 278 s1.SetStructure("a[p1:I,p2:I,p3:I,p4:I]"); 279 c4_View v1 = s1.View("a"); 280 281 v1.Add(p1[1] + p2[3] + p3[15] + p4[127]); 282 A(p1(v1[0]) == 1); 283 A(p2(v1[0]) == 3); 284 A(p3(v1[0]) == 15); 285 A(p4(v1[0]) == 127); 286 287 p1(v1[0]) = 100000L; 288 p2(v1[0]) = 100000L; 289 p3(v1[0]) = 100000L; 290 p4(v1[0]) = 100000L; 291 292 // these failed in 1.61 293 A(p1(v1[0]) == 100000L); 294 A(p2(v1[0]) == 100000L); 295 A(p3(v1[0]) == 100000L); 296 A(p4(v1[0]) == 100000L); 297 298 s1.Commit(); 299 300 } 301 D(s26a); 302 R(s26a); 303 E; 304 305 B(s27, Bytes restructuring, 0)W(s27a); 306 { 307 c4_Bytes test("test", 4); 308 309 c4_BytesProp p1("p1"); 310 c4_Storage s1("s27a", 1); 311 312 c4_Row row; 313 p1(row) = test; 314 315 c4_View v1; 316 v1.Add(row); 317 318 // changed 2000-03-15: Store is gone 319 //s1.Store("a", v1); // asserts in 1.61 320 c4_View v2 = s1.GetAs("a[p1:B]"); 321 v2.InsertAt(0, v1); 322 323 s1.Commit(); 324 325 } 326 D(s27a); 327 R(s27a); 328 E; 329 330#if !q4_TINY 331 B(s28, Doubles added later, 0)W(s28a); 332 { 333 c4_FloatProp p1("p1"); 334 c4_DoubleProp p2("p2"); 335 c4_ViewProp p3("p3"); 336 337 c4_Storage s1("s28a", 1); 338 s1.SetStructure("a[p1:F,p2:D,p3[p1:F,p2:D]]"); 339 c4_View v1 = s1.View("a"); 340 341 c4_Row r1; 342 343 p1(r1) = 123; 344 p2(r1) = 123; 345 346 c4_View v2; 347 v2.Add(p1[234] + p2[234]); 348 p3(r1) = v2; 349 350 v1.Add(r1); 351 double x1 = p1(v1[0]); 352 A(x1 == p2(v1[0])); 353 354 v2 = p3(v1[0]); 355 double x2 = p1(v2[0]); 356 A(x2 == p2(v2[0])); // fails in 1.6 357 358 s1.Commit(); 359 360 } 361 D(s28a); 362 R(s28a); 363 E; 364#endif 365 366 B(s29, Delete bytes property, 0)W(s29a); 367 { 368 { 369 c4_BytesProp p1("p1"); 370 371 c4_Storage s1("s29a", 1); 372 s1.SetStructure("a[p1:B]"); 373 c4_View v1 = s1.View("a"); 374 375 int data = 99; 376 v1.Add(p1[c4_Bytes(&data, sizeof data)]); 377 378 s1.Commit(); 379 } 380 { 381 c4_Storage s1("s29a", 1); 382 c4_View v1 = s1.View("a"); 383 384 v1.RemoveAt(0); // asserts in 1.7 385 386 s1.Commit(); 387 } 388 389 } 390 D(s29a); 391 R(s29a); 392 E; 393} 394