1// tnotify.cpp -- Regression test program, notification tests 2// $Id: tnotify.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 TestNotify() { 8 B(n01, Add to selection, 0) { 9 c4_IntProp p1("p1"); 10 c4_View v1; 11 v1.Add(p1[111]); 12 v1.Add(p1[222]); 13 v1.Add(p1[333]); 14 v1.Add(p1[345]); 15 v1.Add(p1[234]); 16 v1.Add(p1[123]); 17 A(v1.GetSize() == 6); 18 c4_View v2 = v1.SelectRange(p1[200], p1[333]); 19 A(v2.GetSize() == 3); 20 A(p1(v2[0]) == 222); 21 A(p1(v2[1]) == 333); 22 A(p1(v2[2]) == 234); 23 v1.Add(p1[300]); 24 A(v1.GetSize() == 7); 25 A(v2.GetSize() == 4); 26 A(p1(v2[0]) == 222); 27 A(p1(v2[1]) == 333); 28 A(p1(v2[2]) == 234); 29 A(p1(v2[3]) == 300); 30 v1.Add(p1[199]); 31 A(v1.GetSize() == 8); 32 A(v2.GetSize() == 4); 33 A(p1(v2[0]) == 222); 34 A(p1(v2[1]) == 333); 35 A(p1(v2[2]) == 234); 36 A(p1(v2[3]) == 300); 37 } 38 E; 39 40 B(n02, Remove from selection, 0) { 41 c4_IntProp p1("p1"); 42 c4_View v1; 43 v1.Add(p1[111]); 44 v1.Add(p1[222]); 45 v1.Add(p1[333]); 46 v1.Add(p1[345]); 47 v1.Add(p1[234]); 48 v1.Add(p1[123]); 49 A(v1.GetSize() == 6); 50 c4_View v2 = v1.SelectRange(p1[200], p1[333]); 51 A(v2.GetSize() == 3); 52 A(p1(v2[0]) == 222); 53 A(p1(v2[1]) == 333); 54 A(p1(v2[2]) == 234); 55 v1.RemoveAt(2); 56 A(v1.GetSize() == 5); 57 A(v2.GetSize() == 2); 58 A(p1(v2[0]) == 222); 59 A(p1(v2[1]) == 234); 60 v1.RemoveAt(2); 61 A(v1.GetSize() == 4); 62 A(v2.GetSize() == 2); 63 A(p1(v2[0]) == 222); 64 A(p1(v2[1]) == 234); 65 } 66 E; 67 68 B(n03, Modify into selection, 0) { 69 c4_IntProp p1("p1"); 70 c4_View v1; 71 v1.Add(p1[111]); 72 v1.Add(p1[222]); 73 v1.Add(p1[333]); 74 v1.Add(p1[345]); 75 v1.Add(p1[234]); 76 v1.Add(p1[123]); 77 A(v1.GetSize() == 6); 78 c4_View v2 = v1.SelectRange(p1[200], p1[333]); 79 A(v2.GetSize() == 3); 80 A(p1(v2[0]) == 222); 81 A(p1(v2[1]) == 333); 82 A(p1(v2[2]) == 234); 83 p1(v1[5]) = 300; 84 A(v2.GetSize() == 4); 85 A(p1(v2[0]) == 222); 86 A(p1(v2[1]) == 333); 87 A(p1(v2[2]) == 234); 88 A(p1(v2[3]) == 300); 89 } 90 E; 91 92 B(n04, Modify out of selection, 0) { 93 c4_IntProp p1("p1"); 94 c4_View v1; 95 v1.Add(p1[111]); 96 v1.Add(p1[222]); 97 v1.Add(p1[333]); 98 v1.Add(p1[345]); 99 v1.Add(p1[234]); 100 v1.Add(p1[123]); 101 A(v1.GetSize() == 6); 102 c4_View v2 = v1.SelectRange(p1[200], p1[333]); 103 A(v2.GetSize() == 3); 104 A(p1(v2[0]) == 222); 105 A(p1(v2[1]) == 333); 106 A(p1(v2[2]) == 234); 107 p1(v1[2]) = 100; 108 A(v2.GetSize() == 2); 109 A(p1(v2[0]) == 222); 110 A(p1(v2[1]) == 234); 111 } 112 E; 113 114 B(n05, Add to sorted, 0) { 115 c4_IntProp p1("p1"); 116 c4_View v1; 117 v1.Add(p1[111]); 118 v1.Add(p1[222]); 119 v1.Add(p1[333]); 120 v1.Add(p1[345]); 121 v1.Add(p1[234]); 122 v1.Add(p1[123]); 123 A(v1.GetSize() == 6); 124 c4_View v2 = v1.Sort(); 125 A(v2.GetSize() == 6); 126 A(p1(v2[0]) == 111); 127 A(p1(v2[1]) == 123); 128 A(p1(v2[2]) == 222); 129 A(p1(v2[3]) == 234); 130 A(p1(v2[4]) == 333); 131 A(p1(v2[5]) == 345); 132 v1.Add(p1[300]); 133 A(v2.GetSize() == 7); 134 A(p1(v2[0]) == 111); 135 A(p1(v2[1]) == 123); 136 A(p1(v2[2]) == 222); 137 A(p1(v2[3]) == 234); 138 A(p1(v2[4]) == 300); 139 A(p1(v2[5]) == 333); 140 A(p1(v2[6]) == 345); 141 } 142 E; 143 144 B(n06, Remove from sorted, 0) { 145 c4_IntProp p1("p1"); 146 c4_View v1; 147 v1.Add(p1[111]); 148 v1.Add(p1[222]); 149 v1.Add(p1[333]); 150 v1.Add(p1[345]); 151 v1.Add(p1[234]); 152 v1.Add(p1[123]); 153 A(v1.GetSize() == 6); 154 c4_View v2 = v1.Sort(); 155 A(v2.GetSize() == 6); 156 A(p1(v2[0]) == 111); 157 A(p1(v2[1]) == 123); 158 A(p1(v2[2]) == 222); 159 A(p1(v2[3]) == 234); 160 A(p1(v2[4]) == 333); 161 A(p1(v2[5]) == 345); 162 v1.RemoveAt(2); 163 A(v2.GetSize() == 5); 164 A(p1(v2[0]) == 111); 165 A(p1(v2[1]) == 123); 166 A(p1(v2[2]) == 222); 167 A(p1(v2[3]) == 234); 168 A(p1(v2[4]) == 345); 169 } 170 E; 171 172 B(n07, New property through sort, 0) { 173 c4_IntProp p1("p1"), p2("p2"); 174 c4_View v1; 175 v1.Add(p1[11]); 176 v1.Add(p1[1]); 177 v1.Add(p1[111]); 178 A(v1.FindProperty(p2.GetId()) < 0); 179 180 c4_View v2 = v1.SortOn(p1); 181 A(v2.FindProperty(p2.GetId()) < 0); 182 183 A(v2.GetSize() == 3); 184 A(p1(v2[0]) == 1); 185 A(p1(v2[1]) == 11); 186 A(p1(v2[2]) == 111); 187 188 p2(v1[0]) = 22; 189 A(v1.FindProperty(p2.GetId()) == 1); 190 A(v2.FindProperty(p2.GetId()) == 1); 191 192 A(p2(v2[1]) == 22); 193 } 194 E; 195 196 B(n08, Nested project and select, 0) { 197 c4_IntProp p1("p1"), p2("p2"); 198 c4_View v1; 199 v1.Add(p1[10] + p2[1]); 200 v1.Add(p1[11]); 201 v1.Add(p1[12] + p2[1]); 202 v1.Add(p1[13]); 203 v1.Add(p1[14] + p2[1]); 204 v1.Add(p1[15]); 205 v1.Add(p1[16] + p2[1]); 206 A(v1.GetSize() == 7); 207 208 c4_View v2 = v1.Select(p2[1]); 209 A(v2.GetSize() == 4); 210 A(p1(v2[0]) == 10); 211 A(p1(v2[1]) == 12); 212 A(p1(v2[2]) == 14); 213 A(p1(v2[3]) == 16); 214 215 c4_View v3 = v2.Project(p1); 216 A(v3.GetSize() == 4); 217 A(p1(v3[0]) == 10); 218 A(p1(v3[1]) == 12); 219 A(p1(v3[2]) == 14); 220 A(p1(v3[3]) == 16); 221 222 A(p2(v3[0]) == 0); 223 A(p2(v3[1]) == 0); 224 A(p2(v3[2]) == 0); 225 A(p2(v3[3]) == 0); 226 227 /* not yet implemented: setting result of selection 228 p1 (v3[1]) = 123; 229 A(p1 (v3[1]) == 123); 230 A(p1 (v2[1]) == 123); 231 A(p1 (v1[2]) == 123); 232 */ 233 } 234 E; 235 236 B(n09, Multiple dependencies, 0) { 237 c4_IntProp p1("p1"), p2("p2"); 238 c4_View v1; 239 v1.Add(p1[111] + p2[1111]); 240 v1.Add(p1[222]); 241 v1.Add(p1[333]); 242 v1.Add(p1[345]); 243 v1.Add(p1[234]); 244 v1.Add(p1[123]); 245 A(v1.GetSize() == 6); 246 247 c4_View v2 = v1.SelectRange(p1[200], p1[333]); 248 A(v2.GetSize() == 3); 249 A(p1(v2[0]) == 222); 250 A(p1(v2[1]) == 333); 251 A(p1(v2[2]) == 234); 252 253 c4_View v3 = v1.SelectRange(p1[340], p1[350]); 254 A(v3.GetSize() == 1); 255 A(p1(v3[0]) == 345); 256 257 c4_View v4 = v2.SortOn(p1); 258 A(v4.GetSize() == 3); 259 A(p1(v4[0]) == 222); 260 A(p1(v4[1]) == 234); 261 A(p1(v4[2]) == 333); 262 263 c4_View v5 = v3.SortOn(p1); 264 A(v5.GetSize() == 1); 265 A(p1(v5[0]) == 345); 266 267 p1(v1[2]) = 346; 268 269 A(v2.GetSize() == 2); 270 A(p1(v2[0]) == 222); 271 A(p1(v2[1]) == 234); 272 273 A(v3.GetSize() == 2); 274 A(p1(v3[0]) == 346); 275 A(p1(v3[1]) == 345); 276 277 A(v4.GetSize() == 2); 278 A(p1(v4[0]) == 222); 279 A(p1(v4[1]) == 234); 280 281 A(v5.GetSize() == 2); 282 A(p1(v5[0]) == 345); 283 A(p1(v5[1]) == 346); 284 } 285 E; 286 287 B(n10, Modify sorted duplicates, 0) { 288 c4_IntProp p1("p1"); 289 c4_View v1; 290 v1.SetSize(3); 291 p1(v1[0]) = 0; 292 c4_View v2 = v1.Sort(); 293 p1(v1[0]) = 1; 294 p1(v1[1]) = 1; // crashed in 1.5, fix in: c4_SortSeq::PosInMap 295 } 296 E; 297 298 B(n11, Resize compound derived view, 0) { 299 c4_IntProp p1("p1"), p2("p2"); 300 c4_View v1 = (p1, p2); 301 c4_View v2 = v1.SelectRange(p2[200], p2[333]); 302 c4_View v3 = v2.SortOn(p1); 303 A(v2.GetSize() == 0); 304 A(v3.GetSize() == 0); 305 v1.SetSize(1); // crashed in 1.5, fix in: c4_FilterSeq::Match 306 A(v1.GetSize() == 1); 307 A(v2.GetSize() == 0); 308 A(v3.GetSize() == 0); 309 v1[0] = p2[300]; 310 A(v1.GetSize() == 1); 311 A(v2.GetSize() == 1); 312 A(v3.GetSize() == 1); 313 A(p2(v2[0]) == 300); 314 v1.Add(p1[199]); 315 A(v1.GetSize() == 2); 316 A(v2.GetSize() == 1); 317 A(p2(v2[0]) == 300); 318 } 319 E; 320 321 B(n12, Alter multiply derived view, 0) { 322 c4_IntProp p1("p1"); 323 c4_StringProp p2("p2"), p3("p3"); 324 c4_View v1 = (p1, p2); 325 c4_View v2 = v1.Select(p1[1]); 326 c4_View v3 = v2.SortOn(p2); 327 c4_View v4 = v1.Select(p1[2]); 328 c4_View v5 = v4.SortOn(p2); 329 330 v1.Add(p1[1] + p2["een"] + p3["1"]); 331 v1.Add(p1[1] + p2["elf"] + p3["11"]); 332 v1.Add(p1[2] + p2["twee"] + p3["2"]); 333 v1.Add(p1[2] + p2["twaalf"] + p3["12"]); 334 v1.Add(p1[2] + p2["twintig"] + p3["20"]); 335 v1.Add(p1[2] + p2["tachtig"] + p3["80"]); 336 337 A(v1.GetSize() == 6); 338 A(v2.GetSize() == 2); 339 A(v3.GetSize() == 2); 340 A(v4.GetSize() == 4); 341 A(v5.GetSize() == 4); 342 343 A(p3(v1[2]) == (c4_String)"2"); 344 A(p3(v4[0]) == (c4_String)"2"); 345 346 A(p3(v3[0]) == (c4_String)"1"); 347 A(p3(v3[1]) == (c4_String)"11"); 348 349 A(p3(v5[0]) == (c4_String)"80"); 350 A(p3(v5[1]) == (c4_String)"12"); 351 A(p3(v5[2]) == (c4_String)"2"); 352 A(p3(v5[3]) == (c4_String)"20"); 353 354 v1[3] = p1[2] + p2["twaalf"] + p3["12+"]; 355 356 A(p3(v3[0]) == (c4_String)"1"); 357 A(p3(v3[1]) == (c4_String)"11"); 358 359 A(p3(v1[3]) == (c4_String)"12+"); 360 A(p3(v4[1]) == (c4_String)"12+"); 361 362 A(p3(v5[0]) == (c4_String)"80"); 363 A(p3(v5[1]) == (c4_String)"12+"); 364 A(p3(v5[2]) == (c4_String)"2"); 365 A(p3(v5[3]) == (c4_String)"20"); 366 } 367 E; 368 369 B(n13, Project without, 0) { // failed in 1.8.4 370 c4_IntProp p1("p1"), p2("p2"); 371 c4_View v1; 372 373 v1.Add(p1[1] + p2[2]); 374 int n1 = v1.NumProperties(); 375 A(n1 == 2); 376 377 c4_View v2 = v1.ProjectWithout(p2); 378 int n2 = v2.NumProperties(); 379 A(n2 == 1); 380 } 381 E; 382 383 /* 384 B(n14, Add to reverse sorted, 0) 385 { 386 c4_IntProp p1 ("p1"), p2 ("p2"); 387 c4_View v1; 388 v1.Add(p1 [333] + p2 [1]); 389 v1.Add(p1 [345] + p2 [1]); 390 v1.Add(p1 [234] + p2 [1]); 391 v1.Add(p1 [123] + p2 [0]); 392 A(v1.GetSize() == 4); 393 c4_View v1a = v1.Select(p2 [1]); 394 A(v1a.GetSize() == 3); 395 c4_View v1b = v1a.SelectRange(p1 [100], p1 [999]); 396 A(v1b.GetSize() == 3); 397 c4_View v2 = v1b.SortOnReverse(p1, p1); 398 A(v2.GetSize() == 3); 399 A(p1 (v2[0]) == 345); 400 A(p1 (v2[1]) == 333); 401 A(p1 (v2[2]) == 234); 402 v1.Add(p1 [300] + p2 [1]); 403 A(v2.GetSize() == 4); 404 A(p1 (v2[0]) == 345); 405 A(p1 (v2[1]) == 333); 406 A(p1 (v2[2]) == 300); 407 A(p1 (v2[3]) == 234); 408 v1.Add(p1 [299] + p2 [1]); 409 A(v2.GetSize() == 5); 410 A(p1 (v2[0]) == 345); 411 A(p1 (v2[1]) == 333); 412 A(p1 (v2[2]) == 300); 413 A(p1 (v2[3]) == 299); 414 A(p1 (v2[4]) == 234); 415 } E; 416 */ 417 // this failed in 2.4.8, reported by S. Selznick, 2002-11-22 418 B(n14, Insert in non-mapped position, 0)W(n14a); 419 { 420 c4_IntProp p1("p1"); 421 c4_Storage s1("n14a", 1); 422 s1.SetStructure("a[p1:I]"); 423 c4_View v1 = s1.View("a"); 424 425 static int intlist[] = { 426 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, - 1 427 }; 428 for (int c = 0; - 1 != intlist[c]; c++) 429 v1.Add(p1[intlist[c]]); 430 431 A(v1.GetSize() == 10); 432 c4_View v2 = v1.Select(p1[1]); 433 A(v2.GetSize() == 3); 434 435 v1.InsertAt(3, p1[6]); 436 A(v1.GetSize() == 11); 437 A(v2.GetSize() == 3); 438 439 v1.InsertAt(7, p1[1]); 440 A(v1.GetSize() == 12); 441 A(v2.GetSize() == 4); 442 443 s1.Commit(); 444 } 445 D(n14a); 446 R(n14a); 447 E; 448} 449