1// tbasic2.cpp -- Regression test program, basic tests part 2
2// $Id: tbasic2.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
7static int ViewSize(c4_View v) {
8  return v.GetSize();
9}
10
11void TestBasics2() {
12  B(b20, Search sorted view, 0) {
13    c4_IntProp p1("p1");
14    c4_StringProp p2("p2");
15    c4_View v1;
16    v1.Add(p1[111] + p2["one"]);
17    v1.Add(p1[222] + p2["two"]);
18    v1.Add(p1[333] + p2["three"]);
19    v1.Add(p1[345] + p2["four"]);
20    v1.Add(p1[234] + p2["five"]);
21    v1.Add(p1[123] + p2["six"]);
22    c4_View v2 = v1.Sort();
23    A(v2.GetSize() == 6);
24    A(p1(v2[0]) == 111);
25    A(p1(v2[1]) == 123);
26    A(p1(v2[2]) == 222);
27    A(p1(v2[3]) == 234);
28    A(p1(v2[4]) == 333);
29    A(p1(v2[5]) == 345);
30    A(v2.Search(p1[123]) == 1);
31    A(v2.Search(p1[100]) == 0);
32    A(v2.Search(p1[200]) == 2);
33    A(v2.Search(p1[400]) == 6);
34    c4_View v3 = v1.SortOn(p2);
35    A(v3.GetSize() == 6);
36    A(p1(v3[0]) == 234);
37    A(p1(v3[1]) == 345);
38    A(p1(v3[2]) == 111);
39    A(p1(v3[3]) == 123);
40    A(p1(v3[4]) == 333);
41    A(p1(v3[5]) == 222);
42    A(v3.Search(p2["six"]) == 3);
43    A(v3.Search(p2["aha"]) == 0);
44    A(v3.Search(p2["gee"]) == 2);
45    A(v3.Search(p2["wow"]) == 6);
46    c4_View v4 = v1.SortOnReverse(p2, p2);
47    A(v4.GetSize() == 6);
48    A(p1(v4[0]) == 222);
49    A(p1(v4[1]) == 333);
50    A(p1(v4[2]) == 123);
51    A(p1(v4[3]) == 111);
52    A(p1(v4[4]) == 345);
53    A(p1(v4[5]) == 234);
54    A(v4.Search(p2["six"]) == 2);
55    A(v4.Search(p2["aha"]) == 6);
56    A(v4.Search(p2["gee"]) == 4);
57    A(v4.Search(p2["wow"]) == 0);
58  }
59  E;
60
61  B(b21, Memo property, 0) {
62    c4_Row r1;
63    c4_MemoProp p1("p1");
64    c4_Bytes x1("hi!", 3);
65
66    p1(r1) = x1;
67    c4_Bytes x2 = p1(r1);
68    A(x1 == x2);
69  }
70  E;
71
72  B(b22, Stored view references, 0) {
73    c4_ViewProp p1("p1");
74    c4_View v1;
75
76     {
77      v1.Add(p1[c4_View()]);
78    }
79
80    // this works
81    int n = ViewSize(p1.Get(v1[0]));
82    A(n == 0);
83
84    // this fails in 1.8b2 using MSVC 1.52 (tq_wvus)
85    //
86    // The compiler destructs temp c4_View once too often, or
87    // what's more likely, fails to call the constructor once.
88    //
89    // So for MSVC 1.52: use prop.Get(rowref) for subviews,
90    // or immediately assign the result to a c4_View object,
91    // do not pass a "prop (rowref)" expression as argument.
92
93#if _MSC_VER != 800
94    int m = ViewSize(p1(v1[0]));
95    A(m == 0);
96#endif
97  }
98  E;
99
100  B(b23, Sort comparison fix, 0) { // 1.9e: compare buffering problem
101    c4_DoubleProp p1("p1");
102    c4_View v1;
103    for (int i = 0; i < 100; ++i)
104      v1.Add(p1[99-i]);
105    c4_View v2 = v1.Sort();
106    A(v2.GetSize() == 100);
107    for (int j = 0; j < 100; ++j) {
108      A(p1(v1[j]) == (double)99-j);
109      A(p1(v2[j]) == (double)j);
110    }
111  }
112  E;
113
114  B(b24, Custom view comparisons, 0) { // 1.9f: more compare cache problems
115    c4_IntProp p1("p1");
116    c4_FloatProp p2("p2");
117    c4_DoubleProp p3("p3");
118    c4_IntProp p4("p4");
119    c4_View v1;
120    v1.Add(p1[2] + p2[2] + p3[2]);
121    v1.Add(p1[1] + p2[1] + p3[1]);
122    v1.Add(p1[3] + p2[3] + p3[3]);
123    A(v1.GetSize() == 3);
124    A((int)p1(v1[0]) > (int)p1(v1[1]));
125    A((float)p2(v1[0]) > (float)p2(v1[1]));
126    A((double)p3(v1[0]) > (double)p3(v1[1]));
127    A((int)p1(v1[0]) < (int)p1(v1[2]));
128    A((float)p2(v1[0]) < (float)p2(v1[2]));
129    A((double)p3(v1[0]) < (double)p3(v1[2]));
130    c4_View v2 = v1.Unique();
131    A(v2.GetSize() == 3);
132    A((int)p1(v2[0]) != (int)p1(v2[1]));
133    A((float)p2(v2[0]) != (float)p2(v2[1]));
134    A((double)p3(v2[0]) != (double)p3(v2[1]));
135    A((int)p1(v2[0]) != (int)p1(v2[2]));
136    A((float)p2(v2[0]) != (float)p2(v2[2]));
137    A((double)p3(v2[0]) != (double)p3(v2[2]));
138    v1.Add(p1[2] + p2[2] + p3[2]);
139    v1.Add(p1[1] + p2[1] + p3[1]);
140    v1.Add(p1[3] + p2[3] + p3[3]);
141    c4_View v3 = v1.Unique();
142    A(v3.GetSize() == 3);
143    A((int)p1(v3[0]) != (int)p1(v3[1]));
144    A((float)p2(v3[0]) != (float)p2(v3[1]));
145    A((double)p3(v3[0]) != (double)p3(v3[1]));
146    A((int)p1(v3[0]) != (int)p1(v3[2]));
147    A((float)p2(v3[0]) != (float)p2(v3[2]));
148    A((double)p3(v3[0]) != (double)p3(v3[2]));
149    c4_View v4 = v1.Counts(p1, p4);
150    A(v4.GetSize() == 3);
151    c4_View v5 = v1.Counts(p2, p4);
152    A(v5.GetSize() == 3); // this failed in 1.9f
153    c4_View v6 = v1.Counts(p3, p4);
154    A(v6.GetSize() == 3); // this failed in 1.9f
155  }
156  E;
157
158  B(b25, Copy row from derived, 0) {
159    c4_IntProp p1("p1");
160    c4_View v1;
161    v1.Add(p1[111]);
162    v1.Add(p1[222]);
163    v1.Add(p1[333]);
164    c4_View v2 = v1.Select(p1[222]);
165    A(v2.GetSize() == 1);
166    A(p1(v2[0]) == 222);
167    c4_Row r = v2[0];
168    A(p1(r) == 222); // 1.9g: failed because SetAt did not remap
169  }
170  E;
171
172  B(b26, Partial memo field access, 0) {
173    c4_BytesProp p1("p1");
174    c4_View v1;
175    v1.Add(p1[c4_Bytes("12345", 5)]);
176    A(v1.GetSize() == 1);
177    c4_Bytes buf = p1(v1[0]);
178    A(buf.Size() == 5);
179    A(buf == c4_Bytes("12345", 5));
180    buf = p1(v1[0]).Access(1, 3);
181    A(buf == c4_Bytes("234", 3));
182    p1(v1[0]).Modify(c4_Bytes("ab", 2), 2, 0);
183    buf = p1(v1[0]);
184    A(buf == c4_Bytes("12ab5", 5));
185    p1(v1[0]).Modify(c4_Bytes("ABC", 3), 1, 2);
186    buf = p1(v1[0]);
187    A(buf == c4_Bytes("1ABCab5", 7));
188    p1(v1[0]).Modify(c4_Bytes("xyz", 3), 2,  - 2);
189    buf = p1(v1[0]);
190    A(buf == c4_Bytes("1Axyz", 5));
191    p1(v1[0]).Modify(c4_Bytes("3456", 4), 4, 0);
192    buf = p1(v1[0]);
193    A(buf == c4_Bytes("1Axy3456", 8));
194  }
195  E;
196
197  B(b27, Copy value to another row, 0) {
198    c4_StringProp p1("p1");
199    c4_View v1;
200    v1.SetSize(2);
201    p1(v1[1]) = "abc";
202    // next assert fails in MacOS X 10.2.1 "Jaguar" with 2.4.7
203    // seems bug in gcc 3.1, -O i.s.o. -O2 works [jcw 21oct02]
204    A((const char*)(p1(v1[0])) == (c4_String)"");
205    A((const char*)(p1(v1[1])) == (c4_String)"abc");
206
207    // fails in 2.4.0, reported by Jerry McRae, August 2001
208    p1(v1[0]) = (const char*)p1(v1[1]);
209    // MacOS 10.2.3 gcc 3.1 dec 2002 is still weird, inserting the
210    // following code (which should be a noop) *fixes* the assert!
211    //const char* q = p1 (v1[1]);
212    A((c4_String)(const char*)(p1(v1[0])) == (c4_String)"abc");
213  }
214  E;
215}
216