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