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