1// tbasic1.cpp -- Regression test program, basic tests part 1
2// $Id: tbasic1.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 TestBasics1() {
8  B(b00, Should fail, 0) {
9    A(false);
10  }
11  E;
12
13  B(b01, Should succeed, 0) {
14    A(sizeof(t4_byte) == 1);
15    A(sizeof(short) == 2);
16    A(sizeof(t4_i32) == 4);
17    A(sizeof(float) == 4);
18    A(sizeof(double) == 8);
19  }
20  E;
21
22  B(b02, Int property, 0) {
23    c4_Row r1;
24    c4_IntProp p1("p1");
25    p1(r1) = 1234567890L;
26    long x1 = p1(r1);
27    A(x1 == 1234567890L);
28  }
29  E;
30
31#if !q4_TINY
32  B(b03, Float property, 0) {
33    c4_Row r1;
34    c4_FloatProp p1("p1");
35    p1(r1) = 123.456;
36    double x1 = p1(r1);
37    A((float)x1 == (float)123.456);
38  }
39  E;
40#endif
41
42  B(b04, String property, 0) {
43    c4_Row r1;
44    c4_StringProp p1("p1");
45    p1(r1) = "abc";
46    const char *x1 = p1(r1);
47    A((c4_String)x1 == "abc");
48  }
49  E;
50
51  B(b05, View property, 0) {
52    c4_View v1;
53    c4_Row r1;
54    c4_ViewProp p1("p1");
55    p1(r1) = v1;
56    c4_View x1 = p1(r1);
57    // compare cursors to make sure this is the same sequence
58    A(x1[0] == v1[0]);
59  }
60  E;
61
62  B(b06, View construction, 0) {
63    c4_IntProp p1("p1"), p2("p2"), p3("p3");
64    c4_View v1 = (p1, p3, p2);
65    A(v1.FindProperty(p1.GetId()) == 0);
66    A(v1.FindProperty(p2.GetId()) == 2);
67    A(v1.FindProperty(p3.GetId()) == 1);
68  }
69  E;
70
71  B(b07, Row manipulation, 0) {
72    c4_StringProp p1("p1"), p2("p2");
73    c4_IntProp p3("p3");
74    c4_Row r1;
75    p1(r1) = "look at this";
76    const char *x1 = p1(r1);
77    A(x1 == (c4_String)"look at this");
78    r1 = p1["what's in a"] + p2["name..."];
79    c4_String t = (const char*)p2(r1);
80    p1(r1) = t + (const char*)(p1(r1));
81    p2(r1) = p1(r1);
82    c4_String x2 = (const char*)p1(r1); // 2000-03-16, store as c4_String
83    A(x2 == "name...what's in a");
84    // the above change avoids an evaluation order issue in assert below
85    A(x2 == p2(r1));
86    p3(r1) = 12345;
87    p3(r1) = p3(r1) + 123;
88    int x3 = p3(r1);
89    A(x3 == 12345+123);
90  }
91  E;
92
93  B(b08, Row expressions, 0) {
94    c4_StringProp p1("p1"), p2("p2");
95    c4_IntProp p3("p3");
96    c4_Row r1;
97    c4_View v1 = (p1, p2, p3);
98    v1.SetSize(5);
99    r1 = v1[1];
100    v1[2] = v1[1];
101    v1[3] = r1;
102    v1[4] = v1[4];
103    r1 = r1;
104  }
105  E;
106
107  B(b09, View manipulation, 0) {
108    c4_StringProp p1("p1"), p2("p2");
109    c4_Row r1 = p1["One"] + p2["Two"];
110    c4_Row r2;
111    c4_View v1;
112    v1.Add(r1);
113    v1.Add(r2);
114    v1.Add(r1);
115    A(v1.GetSize() == 3);
116    A(v1[0] == r1);
117    A(v1[1] == r2);
118    A(v1[2] == r1);
119    v1.RemoveAt(1, 1);
120    A(v1.GetSize() == 2);
121    A(v1[0] == r1);
122    A(v1[0] == v1[1]);
123  }
124  E;
125
126  B(b10, View sorting, 0) {
127    c4_IntProp p1("p1");
128    c4_View v1;
129    v1.Add(p1[111]);
130    v1.Add(p1[222]);
131    v1.Add(p1[333]);
132    v1.Add(p1[345]);
133    v1.Add(p1[234]);
134    v1.Add(p1[123]);
135    c4_View v2 = v1.Sort();
136    A(v2.GetSize() == 6);
137    A(p1(v2[0]) == 111);
138    A(p1(v2[1]) == 123);
139    A(p1(v2[2]) == 222);
140    A(p1(v2[3]) == 234);
141    A(p1(v2[4]) == 333);
142    A(p1(v2[5]) == 345);
143  }
144  E;
145
146  B(b11, View selection, 0) {
147    c4_IntProp p1("p1");
148    c4_View v1;
149    v1.Add(p1[111]);
150    v1.Add(p1[222]);
151    v1.Add(p1[333]);
152    v1.Add(p1[345]);
153    v1.Add(p1[234]);
154    v1.Add(p1[123]);
155    c4_View v2 = v1.SelectRange(p1[200], p1[333]);
156    A(v2.GetSize() == 3);
157    A(p1(v2[0]) == 222);
158    A(p1(v2[1]) == 333);
159    A(p1(v2[2]) == 234);
160  }
161  E;
162
163  B(b12, Add after remove, 0) {
164    c4_StringProp p1("p1");
165    c4_View v1;
166    v1.Add(p1["abc"]);
167    A(v1.GetSize() == 1);
168    v1.RemoveAt(0);
169    A(v1.GetSize() == 0);
170    v1.Add(p1["def"]);
171    A(v1.GetSize() == 1);
172  }
173  E;
174
175  B(b13, Clear view entry, 0) {
176    c4_IntProp p1("p1");
177    c4_View v1;
178
179    v1.Add(p1[123]);
180    A(v1.GetSize() == 1);
181    A(p1(v1[0]) == 123);
182
183    v1[0] = c4_Row();
184    A(v1.GetSize() == 1);
185    A(p1(v1[0]) == 0);
186  }
187  E;
188
189  B(b14, Empty view outlives temp storage, 0) {
190    c4_View v1;
191    c4_Storage s1;
192    v1 = s1.GetAs("a[p1:I,p2:S]");
193  }
194  E;
195
196  B(b15, View outlives temp storage, 0) {
197    c4_IntProp p1("p1");
198    c4_View v1;
199
200     {
201      c4_Storage s1;
202      v1 = s1.GetAs("a[p1:I,p2:S]");
203      v1.Add(p1[123]);
204    }
205
206    // 19990916 - semantics changed, view now 1 row, but 0 props
207    A(v1.GetSize() == 1);
208    A(v1.NumProperties() == 0);
209    //A(p1 (v1[0]) == 123);
210  }
211  E;
212
213  B(b16, View outlives cleared temp storage, 0) {
214    c4_IntProp p1("p1");
215    c4_View v1;
216
217     {
218      c4_Storage s1;
219      v1 = s1.GetAs("a[p1:I,p2:S]");
220      v1.Add(p1[123]);
221      v1.RemoveAll();
222    }
223
224    A(v1.GetSize() == 0);
225    v1.Add(p1[123]);
226    A(v1.GetSize() == 1);
227    A(p1(v1[0]) == 123);
228  }
229  E;
230
231#if !q4_TINY
232  B(b17, Double property, 0) {
233    c4_Row r1;
234    c4_DoubleProp p1("p1");
235    p1(r1) = 1234.5678;
236    double x1 = p1(r1);
237    A(x1 == (double)1234.5678);
238  }
239  E;
240#endif
241
242  B(b18, SetAtGrow usage, 0) {
243    c4_IntProp p1("p1");
244    c4_View v1;
245
246    v1.SetAtGrow(3, p1[333]);
247    v1.SetAtGrow(1, p1[111]);
248    v1.SetAtGrow(5, p1[555]);
249
250    A(v1.GetSize() == 6);
251    A(p1(v1[1]) == 111);
252    A(p1(v1[3]) == 333);
253    A(p1(v1[5]) == 555);
254  }
255  E;
256
257  B(b19, Bytes property, 0) {
258    c4_Row r1;
259    c4_BytesProp p1("p1");
260    c4_Bytes x1("hi!", 3);
261
262    p1(r1) = x1;
263    c4_Bytes x2 = p1(r1);
264    A(x1 == x2);
265  }
266  E;
267}
268