1// tstore2.cpp -- Regression test program, storage tests, part 2 2// $Id: tstore2.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 TestStores2() { 8 B(s10, Stream storage, 0)W(s10a); 9 W(s10b); 10 W(s10c); 11 { 12 // s10a is original 13 // s10b is a copy, random access 14 // s10c is a serialized copy 15 c4_StringProp p1("p1"); 16 c4_ViewProp p2("p2"); 17 c4_IntProp p3("p3"); 18 { 19 c4_Storage s1("s10a", 1); 20 s1.SetStructure("a[p1:S,p2[p3:I]]"); 21 c4_View v1 = s1.View("a"); 22 v1.Add(p1["one"]); 23 v1.Add(p1["two"]); 24 c4_View v2 = p2(v1[0]); 25 v2.Add(p3[1]); 26 v2 = p2(v1[1]); 27 v2.Add(p3[11]); 28 v2.Add(p3[22]); 29 v1.InsertAt(1, p1["three"]); 30 v2 = p2(v1[1]); 31 v2.Add(p3[111]); 32 v2.Add(p3[222]); 33 v2.Add(p3[333]); 34 s1.Commit(); 35 } 36 { 37 c4_Storage s1("s10a", 0); 38 c4_Storage s2("s10b", 1); 39 s2.SetStructure("a[p1:S,p2[p3:I]]"); 40 s2.View("a") = s1.View("a"); 41 s2.Commit(); 42 } 43 { 44 c4_Storage s3("s10b", 0); 45 46 c4_FileStream fs1(fopen("s10c", "wb"), true); 47 s3.SaveTo(fs1); 48 } 49 { 50 c4_Storage s1("s10c", 0); 51 // new after 2.01: serialized is no longer special 52 53 c4_View v1 = s1.View("a"); 54 A(v1.GetSize() == 3); 55 c4_View v2 = p2(v1[0]); 56 A(v2.GetSize() == 1); 57 c4_View v3 = p2(v1[1]); 58 A(v3.GetSize() == 3); 59 c4_View v4 = p2(v1[2]); 60 A(v4.GetSize() == 2); 61 } 62 { 63 c4_Storage s1; 64 65 c4_FileStream fs1(fopen("s10c", "rb"), true); 66 s1.LoadFrom(fs1); 67 68 c4_View v1 = s1.View("a"); 69 A(v1.GetSize() == 3); 70 c4_View v2 = p2(v1[0]); 71 A(v2.GetSize() == 1); 72 c4_View v3 = p2(v1[1]); 73 A(v3.GetSize() == 3); 74 c4_View v4 = p2(v1[2]); 75 A(v4.GetSize() == 2); 76 } 77 { 78 c4_Storage s1("s10c", 1); 79 80 c4_View v1 = s1.View("a"); 81 A(v1.GetSize() == 3); 82 c4_View v2 = p2(v1[0]); 83 A(v2.GetSize() == 1); 84 c4_View v3 = p2(v1[1]); 85 A(v3.GetSize() == 3); 86 c4_View v4 = p2(v1[2]); 87 A(v4.GetSize() == 2); 88 v1.Add(p1["four"]); 89 s1.Commit(); 90 } 91 { 92 c4_Storage s1("s10c", 0); 93 c4_View v1 = s1.View("a"); 94 A(v1.GetSize() == 4); 95 c4_View v2 = p2(v1[0]); 96 A(v2.GetSize() == 1); 97 c4_View v3 = p2(v1[1]); 98 A(v3.GetSize() == 3); 99 c4_View v4 = p2(v1[2]); 100 A(v4.GetSize() == 2); 101 c4_View v5 = p2(v1[3]); 102 A(v5.GetSize() == 0); 103 } 104 } 105 D(s10a); 106 D(s10b); 107 D(s10c); 108 R(s10a); 109 R(s10b); 110 R(s10c); 111 E; 112 113 B(s11, Commit and rollback, 0)W(s11a); 114 { 115 c4_IntProp p1("p1"); 116 { 117 c4_Storage s1("s11a", 1); 118 s1.SetStructure("a[p1:I]"); 119 c4_View v1 = s1.View("a"); 120 v1.Add(p1[123]); 121 s1.Commit(); 122 } 123 { 124 c4_Storage s1("s11a", 0); 125 c4_View v1 = s1.View("a"); 126 A(v1.GetSize() == 1); 127 A(p1(v1[0]) == 123); 128 v1.InsertAt(0, p1[234]); 129 A(v1.GetSize() == 2); 130 A(p1(v1[0]) == 234); 131 A(p1(v1[1]) == 123); 132 s1.Rollback(); 133 // 19990916 - semantics changed, still 2 rows, but 0 props 134 A(v1.GetSize() == 2); 135 A(v1.NumProperties() == 0); 136 v1 = s1.View("a"); 137 A(v1.GetSize() == 1); 138 A(p1(v1[0]) == 123); 139 } 140 } 141 D(s11a); 142 R(s11a); 143 E; 144 145 B(s12, Remove subview, 0)W(s12a); 146 { 147 c4_IntProp p1("p1"), p3("p3"); 148 c4_ViewProp p2("p2"); 149 { 150 c4_Storage s1("s12a", 1); 151 s1.SetStructure("a[p1:I,p2[p3:I]]"); 152 c4_View v1 = s1.View("a"); 153 c4_View v2; 154 v2.Add(p3[234]); 155 v1.Add(p1[123] + p2[v2]); 156 s1.Commit(); 157 } 158 { 159 c4_Storage s1("s12a", 1); 160 c4_View v1 = s1.View("a"); 161 A(v1.GetSize() == 1); 162 A(p1(v1[0]) == 123); 163 c4_View v2 = p2(v1[0]); 164 A(v2.GetSize() == 1); 165 A(p3(v2[0]) == 234); 166 v1.RemoveAt(0); 167 A(v1.GetSize() == 0); 168 s1.Commit(); 169 A(v1.GetSize() == 0); 170 } 171 } 172 D(s12a); 173 R(s12a); 174 E; 175 176 B(s13, Remove middle subview, 0)W(s13a); 177 { 178 c4_IntProp p1("p1"), p3("p3"); 179 c4_ViewProp p2("p2"); 180 { 181 c4_Storage s1("s13a", 1); 182 s1.SetStructure("a[p1:I,p2[p3:I]]"); 183 c4_View v1 = s1.View("a"); 184 185 c4_View v2a; 186 v2a.Add(p3[234]); 187 v1.Add(p1[123] + p2[v2a]); 188 189 c4_View v2b; 190 v2b.Add(p3[345]); 191 v2b.Add(p3[346]); 192 v1.Add(p1[124] + p2[v2b]); 193 194 c4_View v2c; 195 v2c.Add(p3[456]); 196 v2c.Add(p3[457]); 197 v2c.Add(p3[458]); 198 v1.Add(p1[125] + p2[v2c]); 199 200 s1.Commit(); 201 } 202 { 203 c4_Storage s1("s13a", 1); 204 c4_View v1 = s1.View("a"); 205 A(v1.GetSize() == 3); 206 A(p1(v1[0]) == 123); 207 A(p1(v1[1]) == 124); 208 A(p1(v1[2]) == 125); 209 c4_View v2a = p2(v1[0]); 210 A(v2a.GetSize() == 1); 211 A(p3(v2a[0]) == 234); 212 c4_View v2b = p2(v1[1]); 213 A(v2b.GetSize() == 2); 214 A(p3(v2b[0]) == 345); 215 c4_View v2c = p2(v1[2]); 216 A(v2c.GetSize() == 3); 217 A(p3(v2c[0]) == 456); 218 v1.RemoveAt(1); 219 A(v1.GetSize() == 2); 220 v2a = p2(v1[0]); 221 A(v2a.GetSize() == 1); 222 A(p3(v2a[0]) == 234); 223 v2b = p2(v1[1]); 224 A(v2b.GetSize() == 3); 225 A(p3(v2b[0]) == 456); 226 s1.Commit(); 227 A(v1.GetSize() == 2); 228 A(p1(v1[0]) == 123); 229 A(p1(v1[1]) == 125); 230 } 231 } 232 D(s13a); 233 R(s13a); 234 E; 235 236 B(s14, Replace attached subview, 0)W(s14a); 237 { 238 c4_IntProp p1("p1"); 239 c4_ViewProp p2("p2"); 240 { 241 c4_Storage s1("s14a", 1); 242 s1.SetStructure("a[p1:I,p2[p3:I]]"); 243 c4_View v1 = s1.View("a"); 244 245 v1.Add(p1[123] + p2[c4_View()]); 246 A(v1.GetSize() == 1); 247 248 v1[0] = p2[c4_View()]; 249 A(v1.GetSize() == 1); 250 A(p1(v1[0]) == 0); 251 252 s1.Commit(); 253 } 254 } 255 D(s14a); 256 R(s14a); 257 E; 258 259 B(s15, Add after removed subviews, 0)W(s15a); 260 { 261 c4_IntProp p1("p1"), p3("p3"); 262 c4_ViewProp p2("p2"); 263 { 264 c4_Storage s1("s15a", 1); 265 s1.SetStructure("a[p1:I,p2[p3:I]]"); 266 c4_View v1 = s1.View("a"); 267 268 c4_View v2; 269 v2.Add(p3[234]); 270 271 v1.Add(p1[123] + p2[v2]); 272 v1.Add(p1[456] + p2[v2]); 273 v1.Add(p1[789] + p2[v2]); 274 A(v1.GetSize() == 3); 275 276 v1[0] = v1[2]; 277 v1.RemoveAt(2); 278 279 v1[0] = v1[1]; 280 v1.RemoveAt(1); 281 282 v1.RemoveAt(0); 283 284 v1.Add(p1[111] + p2[v2]); 285 286 s1.Commit(); 287 } 288 } 289 D(s15a); 290 R(s15a); 291 E; 292 293 B(s16, Add after removed ints, 0)W(s16a); 294 { 295 c4_IntProp p1("p1"); 296 297 c4_Storage s1("s16a", 1); 298 s1.SetStructure("a[p1:I,p2[p3:I]]"); 299 c4_View v1 = s1.View("a"); 300 301 v1.Add(p1[1]); 302 v1.Add(p1[2]); 303 v1.Add(p1[3]); 304 305 v1.RemoveAt(2); 306 v1.RemoveAt(1); 307 v1.RemoveAt(0); 308 309 v1.Add(p1[4]); 310 311 s1.Commit(); 312 313 } 314 D(s16a); 315 R(s16a); 316 E; 317 318 B(s17, Add after removed strings, 0)W(s17a); 319 { 320 c4_StringProp p1("p1"); 321 322 c4_Storage s1("s17a", 1); 323 s1.SetStructure("a[p1:S,p2[p3:I]]"); 324 c4_View v1 = s1.View("a"); 325 326 v1.Add(p1["one"]); 327 v1.Add(p1["two"]); 328 v1.Add(p1["three"]); 329 330 v1.RemoveAt(2); 331 v1.RemoveAt(1); 332 v1.RemoveAt(0); 333 334 v1.Add(p1["four"]); 335 336 s1.Commit(); 337 338 } 339 D(s17a); 340 R(s17a); 341 E; 342 343 B(s18, Empty storage, 0)W(s18a); 344 { 345 c4_Storage s1("s18a", 1); 346 347 } 348 D(s18a); 349 R(s18a); 350 E; 351 352 B(s19, Empty view outlives storage, 0)W(s19a); 353 { 354 c4_View v1; 355 c4_Storage s1("s19a", 1); 356 v1 = s1.GetAs("a[p1:I,p2:S]"); 357 358 } 359 D(s19a); 360 R(s19a); 361 E; 362} 363