1// tformat.cpp -- Regression test program, (re-)format tests
2// $Id: tformat.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 TestFormat() {
8  B(f01, Add view to format, 0)W(f01a);
9   {
10    c4_IntProp p1("p1");
11    c4_IntProp p2("p2");
12     {
13      c4_Storage s1("f01a", 1);
14      s1.SetStructure("a[p1:I]");
15
16      c4_View v1 = s1.View("a");
17      v1.Add(p1[123]);
18      s1.Commit();
19
20      c4_View v2 = s1.GetAs("b[p2:I]");
21
22      v2.Add(p2[345]);
23      v2.Add(p2[567]);
24
25      s1.Commit();
26    }
27     {
28      c4_Storage s1("f01a", 0);
29
30      c4_View v1 = s1.View("a");
31      A(v1.GetSize() == 1);
32      A(p1(v1[0]) == 123);
33
34      c4_View v2 = s1.View("b");
35      A(v2.GetSize() == 2);
36      A(p2(v2[0]) == 345);
37      A(p2(v2[1]) == 567);
38    }
39  }
40  D(f01a);
41  R(f01a);
42  E;
43
44  B(f02, Remove view from format, 0)W(f02a);
45   {
46    c4_IntProp p1("p1");
47    c4_IntProp p2("p2");
48     {
49      c4_Storage s1("f02a", 1);
50      s1.SetStructure("a[p1:I],b[p2:I]");
51
52      c4_View v1 = s1.View("a");
53      v1.Add(p1[123]);
54
55      c4_View v2 = s1.View("b");
56      v2.Add(p2[345]);
57      v2.Add(p2[567]);
58
59      s1.Commit();
60    }
61     {
62      c4_Storage s1("f02a", 1);
63      s1.SetStructure("b[p2:I]");
64
65      c4_View v1 = s1.View("a");
66      A(v1.GetSize() == 1); // 19990916 new semantics, still as temp view
67      A(p1(v1[0]) == 123);
68
69      c4_View v2 = s1.View("b");
70      A(v2.GetSize() == 2);
71      A(p2(v2[0]) == 345);
72      A(p2(v2[1]) == 567);
73
74      s1.Commit();
75    }
76     {
77      c4_Storage s1("f02a", 0);
78
79      c4_View v1 = s1.View("a");
80      A(v1.GetSize() == 0);
81
82      c4_View v2 = s1.View("b");
83      A(v2.GetSize() == 2);
84      A(p2(v2[0]) == 345);
85      A(p2(v2[1]) == 567);
86    }
87  }
88  D(f02a);
89  R(f02a);
90  E;
91
92  B(f03, Rollback format change, 0)W(f03a);
93   {
94    c4_IntProp p1("p1");
95     {
96      c4_Storage s1("f03a", 1);
97      s1.SetStructure("a[p1:I]");
98
99      c4_View v1 = s1.View("a");
100      v1.Add(p1[123]);
101
102      s1.Commit();
103
104      v1 = s1.GetAs("a");
105      A(v1.GetSize() == 0);
106
107      s1.Rollback();
108
109      v1 = s1.View("a");
110      A(v1.GetSize() == 1);
111      A(p1(v1[0]) == 123);
112    }
113  }
114  D(f03a);
115  R(f03a);
116  E;
117
118  B(f04, Rearrange format, 0)W(f04a);
119   {
120    c4_IntProp p1("p1");
121    c4_IntProp p2("p2");
122     {
123      c4_Storage s1("f04a", 1);
124      s1.SetStructure("a[p1:I],b[p2:I]");
125
126      c4_View v1 = s1.View("a");
127      v1.Add(p1[123]);
128
129      c4_View v2 = s1.View("b");
130      v2.Add(p2[345]);
131      v2.Add(p2[567]);
132
133      s1.Commit();
134    }
135     {
136      c4_Storage s1("f04a", 1);
137      s1.SetStructure("b[p2:I],a[p1:I]");
138
139      c4_View v1 = s1.View("a");
140      A(v1.GetSize() == 1);
141      A(p1(v1[0]) == 123);
142
143      c4_View v2 = s1.View("b");
144      A(v2.GetSize() == 2);
145      A(p2(v2[0]) == 345);
146      A(p2(v2[1]) == 567);
147
148      s1.Commit();
149    }
150  }
151  D(f04a);
152  R(f04a);
153  E;
154
155  B(f05, Nested reformat, 0)W(f05a);
156   {
157    c4_IntProp p1("p1");
158    c4_IntProp p2("p2");
159     {
160      c4_Storage s1("f05a", 1);
161      s1.SetStructure("a[p1:I],b[p2:I]");
162
163      c4_View v1 = s1.View("a");
164      v1.Add(p1[123]);
165
166      c4_View v2 = s1.View("b");
167      v2.Add(p2[345]);
168      v2.Add(p2[567]);
169
170      s1.Commit();
171    }
172     {
173      c4_Storage s1("f05a", 1);
174      s1.SetStructure("a[p1:I],b[p1:I,p2:I]");
175
176      c4_View v2 = s1.View("b");
177      p1(v2[0]) = 543;
178      p1(v2[1]) = 765;
179
180      s1.Commit();
181    }
182     {
183      c4_Storage s1("f05a", 0);
184
185      c4_View v1 = s1.View("a");
186      A(v1.GetSize() == 1);
187      A(p1(v1[0]) == 123);
188
189      c4_View v2 = s1.View("b");
190      A(v2.GetSize() == 2);
191      A(p1(v2[0]) == 543);
192      A(p1(v2[1]) == 765);
193      A(p2(v2[0]) == 345);
194      A(p2(v2[1]) == 567);
195    }
196  }
197  D(f05a);
198  R(f05a);
199  E;
200
201  B(f06, Flip foreign data, 0) {
202    D(reversed); // not created here, only dump existing file
203  }
204  E;
205
206  B(f07, Automatic structure info (obsolete), 0)W(f07a);
207   {
208    /* Structure() and Store() are no longer supported
209    c4_StringProp p1 ("p1"), p2 ("p2");
210    c4_Row r1 = p1 ["One"] + p2 ["Two"];
211    c4_Row r2;
212    c4_View v1;
213    v1.Add(r1);
214    v1.Add(r2);
215    v1.Add(r1);
216
217    c4_View v2 = v1.Structure();
218    A(v2.GetSize() == 1);
219
220    c4_ViewProp pView ("view");
221    c4_View v3 = pView (v2[0]);
222    A(v3.GetSize() == 2);
223     */
224#define FORMAT07 "dict[parent:I,index:I,view[name:S,type:S,child:I]]"
225    c4_Storage s1("f07a", 1);
226    s1.SetStructure(FORMAT07);
227
228    //s1.View("dict") = v1.Structure();
229
230    s1.Commit();
231
232  }
233  D(f07a);
234  R(f07a);
235  E;
236
237  B(f08, Automatic storage format, 0)W(f08a);
238   {
239    c4_StringProp p1("p1"), p2("p2");
240    c4_Row r1 = p1["One"] + p2["Two"];
241    c4_Row r2;
242    c4_View v1;
243    v1.Add(r1);
244    v1.Add(r2);
245    v1.Add(r1);
246
247    c4_Storage s1("f08a", 1);
248
249    // changed 2000-03-15: Store is gone
250    //s1.Store("dict", v1);
251    c4_View v2 = s1.GetAs("dict[p1:S,p2:S]");
252    v2.InsertAt(0, v1);
253
254    s1.Commit();
255
256  }
257  D(f08a);
258  R(f08a);
259  E;
260
261  B(f09, Partial restructuring, 0)W(f09a);
262   {
263    c4_IntProp p1("p1"), p2("p2"), p3("p3");
264    c4_Storage s1("f09a", 1);
265
266    c4_View v1 = s1.GetAs("a[p1:I]");
267    v1.SetSize(10);
268
269    for (int i = 0; i < v1.GetSize(); ++i)
270      p1(v1[i]) = 1000+i;
271
272    c4_View v2 = s1.GetAs("a[p1:I,p2:I]");
273
274    for (int j = 0; j < v2.GetSize(); j += 2)
275      p2(v2[j]) = 2000+j;
276
277    c4_View v3 = s1.GetAs("a[p1:I,p2:I,p3:I]");
278
279    for (int k = 0; k < v3.GetSize(); k += 3)
280      p3(v3[k]) = 3000+k;
281
282    s1.Commit();
283
284  }
285  D(f09a);
286  R(f09a);
287  E;
288
289  B(f10, Committed restructuring, 0)W(f10a);
290   {
291    c4_IntProp p1("p1"), p2("p2"), p3("p3");
292    c4_Storage s1("f10a", 1);
293
294    c4_View v1 = s1.GetAs("a[p1:I]");
295    v1.SetSize(10);
296
297    for (int i = 0; i < v1.GetSize(); ++i)
298      p1(v1[i]) = 1000+i;
299
300    s1.Commit();
301
302    c4_View v2 = s1.GetAs("a[p1:I,p2:I]");
303
304    for (int j = 0; j < v2.GetSize(); j += 2)
305      p2(v2[j]) = 2000+j;
306
307    s1.Commit();
308
309    c4_View v3 = s1.GetAs("a[p1:I,p2:I,p3:I]");
310
311    for (int k = 0; k < v3.GetSize(); k += 3)
312      p3(v3[k]) = 3000+k;
313
314    s1.Commit();
315
316  }
317  D(f10a);
318  R(f10a);
319  E;
320
321  // 19990824: don't crash on GetAs with an inexistent view
322  B(f11, Delete missing view, 0)W(f11a);
323   {
324    c4_Storage s1("f11a", 1);
325
326    c4_View v1 = s1.GetAs("a");
327    v1.SetSize(10);
328
329    s1.Commit();
330
331  }
332  D(f11a);
333  R(f11a);
334  E;
335}
336