1// tcusto2.cpp -- Regression test program, custom view tests 2// $Id: tcusto2.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 TestCustom2() { 8 B(c11, Unique operation, 0); 9 { 10 c4_IntProp p1("p1"), p2("p2"); 11 12 c4_View v1, v2, v3; 13 14 v1.Add(p1[1] + p2[11]); 15 v1.Add(p1[1] + p2[22]); 16 v1.Add(p1[2] + p2[33]); 17 v1.Add(p1[2] + p2[33]); 18 v1.Add(p1[3] + p2[44]); 19 v1.Add(p1[4] + p2[55]); 20 v1.Add(p1[4] + p2[55]); 21 v1.Add(p1[4] + p2[55]); 22 23 v2 = v1.Unique(); 24 A(v2.GetSize() == 5); 25 A(p1(v2[0]) == 1); 26 A(p1(v2[1]) == 1); 27 A(p1(v2[2]) == 2); 28 A(p1(v2[3]) == 3); 29 A(p1(v2[4]) == 4); 30 31 A(p2(v2[0]) == 11); 32 A(p2(v2[1]) == 22); 33 A(p2(v2[2]) == 33); 34 A(p2(v2[3]) == 44); 35 A(p2(v2[4]) == 55); 36 37 } 38 E; 39 40 B(c12, Union operation, 0) { 41 c4_IntProp p1("p1"); 42 43 c4_View v1, v2, v3; 44 45 v1.Add(p1[1]); 46 v1.Add(p1[2]); 47 v1.Add(p1[3]); 48 49 v2.Add(p1[2]); 50 v2.Add(p1[3]); 51 v2.Add(p1[4]); 52 v2.Add(p1[5]); 53 54 v3 = v1.Union(v2); 55 A(v3.GetSize() == 5); 56 A(p1(v3[0]) == 1); 57 A(p1(v3[1]) == 2); 58 A(p1(v3[2]) == 3); 59 A(p1(v3[3]) == 4); 60 A(p1(v3[4]) == 5); 61 } 62 E; 63 64 B(c13, Intersect operation, 0) { 65 c4_IntProp p1("p1"); 66 67 c4_View v1, v2, v3; 68 69 v1.Add(p1[1]); 70 v1.Add(p1[2]); 71 v1.Add(p1[3]); 72 73 v2.Add(p1[2]); 74 v2.Add(p1[3]); 75 v2.Add(p1[4]); 76 v2.Add(p1[5]); 77 78 v3 = v1.Intersect(v2); 79 A(v3.GetSize() == 2); 80 A(p1(v3[0]) == 2); 81 A(p1(v3[1]) == 3); 82 } 83 E; 84 85 B(c14, Different operation, 0) { 86 c4_IntProp p1("p1"); 87 88 c4_View v1, v2, v3; 89 90 v1.Add(p1[1]); 91 v1.Add(p1[2]); 92 v1.Add(p1[3]); 93 94 v2.Add(p1[2]); 95 v2.Add(p1[3]); 96 v2.Add(p1[4]); 97 v2.Add(p1[5]); 98 99 v3 = v1.Different(v2); 100 A(v3.GetSize() == 3); 101 A(p1(v3[0]) == 1); 102 A(p1(v3[1]) == 4); 103 A(p1(v3[2]) == 5); 104 } 105 E; 106 107 B(c15, Minus operation, 0) { 108 c4_IntProp p1("p1"); 109 110 c4_View v1, v2, v3; 111 112 v1.Add(p1[1]); 113 v1.Add(p1[2]); 114 v1.Add(p1[3]); 115 116 v2.Add(p1[2]); 117 v2.Add(p1[3]); 118 v2.Add(p1[4]); 119 v2.Add(p1[5]); 120 121 v3 = v1.Minus(v2); 122 A(v3.GetSize() == 1); 123 A(p1(v3[0]) == 1); 124 } 125 E; 126 127 B(c16, View comparisons, 0) { 128 c4_IntProp p1("p1"); 129 130 c4_View v1; 131 v1.Add(p1[1]); 132 v1.Add(p1[2]); 133 v1.Add(p1[3]); 134 v1.Add(p1[4]); 135 v1.Add(p1[5]); 136 137 A(v1 == v1); 138 A(v1 == v1.Slice(0)); 139 A(v1.Slice(0, 2) < v1.Slice(0, 3)); 140 A(v1.Slice(0, 3) == v1.Slice(0, 3)); 141 A(v1.Slice(0, 4) > v1.Slice(0, 3)); 142 A(v1.Slice(0, 3) < v1.Slice(1, 3)); 143 A(v1.Slice(0, 3) < v1.Slice(1, 4)); 144 A(v1.Slice(1, 3) > v1.Slice(0, 3)); 145 A(v1.Slice(1, 4) > v1.Slice(0, 3)); 146 } 147 E; 148 149 B(c17, Join operation, 0) { 150 c4_StringProp p1("p1"), p2("p2"); 151 c4_IntProp p3("p3"); 152 153 c4_View v1, v2, v3; 154 155 v1.Add(p1[""]); 156 v1.Add(p1["1"] + p2["a"]); 157 v1.Add(p1["12"] + p2["ab"]); 158 v1.Add(p1["123"] + p2["abc"]); 159 160 v2.Add(p1["1"] + p3[1]); 161 v2.Add(p1["12"] + p3[1]); 162 v2.Add(p1["12"] + p3[2]); 163 v2.Add(p1["123"] + p3[1]); 164 v2.Add(p1["123"] + p3[2]); 165 v2.Add(p1["123"] + p3[3]); 166 167 v3 = v1.Join(p1, v2); // inner join 168 A(v3.GetSize() == 6); 169 170 A(p1(v3[0]) == (c4_String)"1"); 171 A(p1(v3[1]) == (c4_String)"12"); 172 A(p1(v3[2]) == (c4_String)"12"); 173 A(p1(v3[3]) == (c4_String)"123"); 174 A(p1(v3[4]) == (c4_String)"123"); 175 A(p1(v3[5]) == (c4_String)"123"); 176 177 A(p2(v3[0]) == (c4_String)"a"); 178 A(p2(v3[1]) == (c4_String)"ab"); 179 A(p2(v3[2]) == (c4_String)"ab"); 180 A(p2(v3[3]) == (c4_String)"abc"); 181 A(p2(v3[4]) == (c4_String)"abc"); 182 A(p2(v3[5]) == (c4_String)"abc"); 183 184 A(p3(v3[0]) == 1); 185 A(p3(v3[1]) == 1); 186 A(p3(v3[2]) == 2); 187 A(p3(v3[3]) == 1); 188 A(p3(v3[4]) == 2); 189 A(p3(v3[5]) == 3); 190 191 v3 = v1.Join(p1, v2, true); // outer join 192 A(v3.GetSize() == 7); 193 194 A(p1(v3[0]) == (c4_String)""); 195 A(p1(v3[1]) == (c4_String)"1"); 196 A(p1(v3[2]) == (c4_String)"12"); 197 A(p1(v3[3]) == (c4_String)"12"); 198 A(p1(v3[4]) == (c4_String)"123"); 199 A(p1(v3[5]) == (c4_String)"123"); 200 A(p1(v3[6]) == (c4_String)"123"); 201 202 A(p2(v3[0]) == (c4_String)""); 203 A(p2(v3[1]) == (c4_String)"a"); 204 A(p2(v3[2]) == (c4_String)"ab"); 205 A(p2(v3[3]) == (c4_String)"ab"); 206 A(p2(v3[4]) == (c4_String)"abc"); 207 A(p2(v3[5]) == (c4_String)"abc"); 208 A(p2(v3[6]) == (c4_String)"abc"); 209 210 A(p3(v3[0]) == 0); 211 A(p3(v3[1]) == 1); 212 A(p3(v3[2]) == 1); 213 A(p3(v3[3]) == 2); 214 A(p3(v3[4]) == 1); 215 A(p3(v3[5]) == 2); 216 A(p3(v3[6]) == 3); 217 } 218 E; 219 220 B(c18, Groupby sort fix, 0) { // fails in 1.8.4 (from P. Ritter, 14-10-1998) 221 c4_StringProp p1("Country"); 222 c4_StringProp p2("City"); 223 c4_ViewProp p3("SubList"); 224 225 c4_View v1, v2, v3; 226 227 v1.Add(p1["US"] + p2["Philadelphia"]); 228 v1.Add(p1["France"] + p2["Bordeaux"]); 229 v1.Add(p1["US"] + p2["Miami"]); 230 v1.Add(p1["France"] + p2["Paris"]); 231 v1.Add(p1["US"] + p2["Boston"]); 232 v1.Add(p1["France"] + p2["Nice"]); 233 v1.Add(p1["US"] + p2["NY"]); 234 v1.Add(p1["US"] + p2["Miami"]); 235 236 v2 = v1.GroupBy(p1, p3); 237 A(v2.GetSize() == 2); 238 A(p1(v2[0]) == (c4_String)"France"); 239 A(p1(v2[1]) == (c4_String)"US"); 240 241 v3 = p3(v2[0]); 242 A(v3.GetSize() == 3); 243 A(p2(v3[0]) == (c4_String)"Bordeaux"); 244 A(p2(v3[1]) == (c4_String)"Nice"); 245 A(p2(v3[2]) == (c4_String)"Paris"); 246 v3 = p3(v2[1]); 247 A(v3.GetSize() == 5); 248 A(p2(v3[0]) == (c4_String)"Boston"); 249 A(p2(v3[1]) == (c4_String)"Miami"); 250 A(p2(v3[2]) == (c4_String)"Miami"); 251 A(p2(v3[3]) == (c4_String)"NY"); 252 A(p2(v3[4]) == (c4_String)"Philadelphia"); 253 } 254 E; 255 256 B(c19, JoinProp operation, 0) { // moved, used to also be called c15 257 c4_StringProp p1("p1"); 258 c4_ViewProp p2("p2"); 259 c4_IntProp p3("p3"); 260 261 c4_View v1, v2a, v2b, v2c, v3; 262 263 v2a.Add(p3[1]); 264 v2a.Add(p3[2]); 265 v2a.Add(p3[3]); 266 v1.Add(p1["123"] + p2[v2a]); 267 268 v2b.Add(p3[1]); 269 v2b.Add(p3[2]); 270 v1.Add(p1["12"] + p2[v2b]); 271 272 v2c.Add(p3[1]); 273 v1.Add(p1["1"] + p2[v2c]); 274 275 v1.Add(p1[""]); 276 277 v3 = v1.JoinProp(p2); // inner join 278 A(v3.GetSize() == 6); 279 280 A(p1(v3[0]) == (c4_String)"123"); 281 A(p1(v3[1]) == (c4_String)"123"); 282 A(p1(v3[2]) == (c4_String)"123"); 283 A(p1(v3[3]) == (c4_String)"12"); 284 A(p1(v3[4]) == (c4_String)"12"); 285 A(p1(v3[5]) == (c4_String)"1"); 286 287 A(p3(v3[0]) == 1); 288 A(p3(v3[1]) == 2); 289 A(p3(v3[2]) == 3); 290 A(p3(v3[3]) == 1); 291 A(p3(v3[4]) == 2); 292 A(p3(v3[5]) == 1); 293 294 v3 = v1.JoinProp(p2, true); // outer join 295 A(v3.GetSize() == 7); 296 297 A(p1(v3[0]) == (c4_String)"123"); 298 A(p1(v3[1]) == (c4_String)"123"); 299 A(p1(v3[2]) == (c4_String)"123"); 300 A(p1(v3[3]) == (c4_String)"12"); 301 A(p1(v3[4]) == (c4_String)"12"); 302 A(p1(v3[5]) == (c4_String)"1"); 303 A(p1(v3[6]) == (c4_String)""); 304 305 A(p3(v3[0]) == 1); 306 A(p3(v3[1]) == 2); 307 A(p3(v3[2]) == 3); 308 A(p3(v3[3]) == 1); 309 A(p3(v3[4]) == 2); 310 A(p3(v3[5]) == 1); 311 A(p3(v3[6]) == 0); 312 } 313 E; 314 315 B(c20, Wide cartesian product, 0) { 316 // added 2nd prop's to do a better test - 1999-12-23 317 c4_IntProp p1("p1"); 318 c4_IntProp p2("p2"); 319 c4_IntProp p3("p3"); 320 c4_IntProp p4("p4"); 321 322 c4_View v1; 323 v1.Add(p1[123] + p2[321]); 324 v1.Add(p1[234] + p2[432]); 325 v1.Add(p1[345] + p2[543]); 326 327 c4_View v2; 328 v2.Add(p3[111] + p4[11]); 329 v2.Add(p3[222] + p4[22]); 330 331 c4_View v3 = v1.Product(v2); 332 A(v3.GetSize() == 6); 333 A(p1(v3[0]) == 123); 334 A(p2(v3[0]) == 321); 335 A(p3(v3[0]) == 111); 336 A(p4(v3[0]) == 11); 337 A(p1(v3[1]) == 123); 338 A(p2(v3[1]) == 321); 339 A(p3(v3[1]) == 222); 340 A(p4(v3[1]) == 22); 341 A(p1(v3[2]) == 234); 342 A(p2(v3[2]) == 432); 343 A(p3(v3[2]) == 111); 344 A(p4(v3[2]) == 11); 345 A(p1(v3[3]) == 234); 346 A(p2(v3[3]) == 432); 347 A(p3(v3[3]) == 222); 348 A(p4(v3[3]) == 22); 349 A(p1(v3[4]) == 345); 350 A(p2(v3[4]) == 543); 351 A(p3(v3[4]) == 111); 352 A(p4(v3[4]) == 11); 353 A(p1(v3[5]) == 345); 354 A(p2(v3[5]) == 543); 355 A(p3(v3[5]) == 222); 356 A(p4(v3[5]) == 22); 357 358 v1.Add(p1[456]); 359 A(v3.GetSize() == 8); 360 v2.Add(p2[333]); 361 A(v3.GetSize() == 12); 362 } 363 E; 364 365 B(c21, Join on compound key, 0) { 366 c4_IntProp p1("p1"), p2("p2"), p3("p3"), p4("p4"); 367 368 c4_View v1, v2, v3; 369 370 v1.Add(p1[1] + p2[11] + p3[111]); 371 v1.Add(p1[2] + p2[22] + p3[222]); 372 v1.Add(p1[3] + p2[22] + p3[111]); 373 374 v2.Add(p2[11] + p3[111] + p4[1111]); 375 v2.Add(p2[22] + p3[222] + p4[2222]); 376 v2.Add(p2[22] + p3[222] + p4[3333]); 377 v2.Add(p2[22] + p3[333] + p4[4444]); 378 379 // this works here, but it fails in Python, i.e. Mk4py 2.4.0 380 v3 = v1.Join((p2, p3), v2); 381 382 A(v3.GetSize() == 3); 383 384 A(p1(v3[0]) == 1); 385 A(p1(v3[1]) == 2); 386 A(p1(v3[2]) == 2); 387 388 A(p2(v3[0]) == 11); 389 A(p2(v3[1]) == 22); 390 A(p2(v3[2]) == 22); 391 392 A(p3(v3[0]) == 111); 393 A(p3(v3[1]) == 222); 394 A(p3(v3[2]) == 222); 395 396 A(p4(v3[0]) == 1111); 397 A(p4(v3[1]) == 2222); 398 A(p4(v3[2]) == 3333); 399 } 400 E; 401 402 B(c22, Groupby with selection, 0) { 403 c4_Storage s1; 404 c4_View v1 = s1.GetAs("v1[p1:I,p2:I,p3:I]"); 405 c4_IntProp p1("p1"), p2("p2"), p3("p3"); 406 c4_ViewProp p4("p4"); 407 408 v1.Add(p1[0] + p2[1] + p3[10]); 409 v1.Add(p1[1] + p2[1] + p3[20]); 410 v1.Add(p1[2] + p2[2] + p3[30]); 411 v1.Add(p1[3] + p2[3] + p3[40]); 412 v1.Add(p1[4] + p2[3] + p3[50]); 413 414 s1.Commit(); 415 A(v1.GetSize() == 5); 416 417 c4_View v2 = v1.GroupBy(p2, p4); 418 A(v2.GetSize() == 3); 419 420 c4_View v3 = p4(v2[0]); 421 A(v3.GetSize() == 2); 422 A(p3(v3[0]) == 10); 423 A(p3(v3[1]) == 20); 424 425 c4_View v4 = p4(v2[1]); 426 A(v4.GetSize() == 1); 427 A(p3(v4[0]) == 30); 428 429 c4_View v5 = p4(v2[2]); 430 A(v5.GetSize() == 2); 431 A(p3(v5[0]) == 40); 432 A(p3(v5[1]) == 50); 433 434 c4_View v6 = v4.Sort(); 435 A(v6.GetSize() == 1); 436 A(p1(v6[0]) == 2); 437 A(p3(v6[0]) == 30); 438 439 } 440 E; 441} 442