1// tstore2.cpp -- Regression test program, storage tests, part 2
2// $Id: tstore2.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 TestStores2() {
8  B(s10, Stream storage, 0)W(s10a);
9  W(s10b);
10  W(s10c);
11   {
12    // s10a is original
13    // s10b is a copy, random access
14    // s10c is a serialized copy
15    c4_StringProp p1("p1");
16    c4_ViewProp p2("p2");
17    c4_IntProp p3("p3");
18     {
19      c4_Storage s1("s10a", 1);
20      s1.SetStructure("a[p1:S,p2[p3:I]]");
21      c4_View v1 = s1.View("a");
22      v1.Add(p1["one"]);
23      v1.Add(p1["two"]);
24      c4_View v2 = p2(v1[0]);
25      v2.Add(p3[1]);
26      v2 = p2(v1[1]);
27      v2.Add(p3[11]);
28      v2.Add(p3[22]);
29      v1.InsertAt(1, p1["three"]);
30      v2 = p2(v1[1]);
31      v2.Add(p3[111]);
32      v2.Add(p3[222]);
33      v2.Add(p3[333]);
34      s1.Commit();
35    }
36     {
37      c4_Storage s1("s10a", 0);
38      c4_Storage s2("s10b", 1);
39      s2.SetStructure("a[p1:S,p2[p3:I]]");
40      s2.View("a") = s1.View("a");
41      s2.Commit();
42    }
43     {
44      c4_Storage s3("s10b", 0);
45
46      c4_FileStream fs1(fopen("s10c", "wb"), true);
47      s3.SaveTo(fs1);
48    }
49     {
50      c4_Storage s1("s10c", 0);
51        // new after 2.01: serialized is no longer special
52
53      c4_View v1 = s1.View("a");
54      A(v1.GetSize() == 3);
55      c4_View v2 = p2(v1[0]);
56      A(v2.GetSize() == 1);
57      c4_View v3 = p2(v1[1]);
58      A(v3.GetSize() == 3);
59      c4_View v4 = p2(v1[2]);
60      A(v4.GetSize() == 2);
61    }
62     {
63      c4_Storage s1;
64
65      c4_FileStream fs1(fopen("s10c", "rb"), true);
66      s1.LoadFrom(fs1);
67
68      c4_View v1 = s1.View("a");
69      A(v1.GetSize() == 3);
70      c4_View v2 = p2(v1[0]);
71      A(v2.GetSize() == 1);
72      c4_View v3 = p2(v1[1]);
73      A(v3.GetSize() == 3);
74      c4_View v4 = p2(v1[2]);
75      A(v4.GetSize() == 2);
76    }
77     {
78      c4_Storage s1("s10c", 1);
79
80      c4_View v1 = s1.View("a");
81      A(v1.GetSize() == 3);
82      c4_View v2 = p2(v1[0]);
83      A(v2.GetSize() == 1);
84      c4_View v3 = p2(v1[1]);
85      A(v3.GetSize() == 3);
86      c4_View v4 = p2(v1[2]);
87      A(v4.GetSize() == 2);
88      v1.Add(p1["four"]);
89      s1.Commit();
90    }
91     {
92      c4_Storage s1("s10c", 0);
93      c4_View v1 = s1.View("a");
94      A(v1.GetSize() == 4);
95      c4_View v2 = p2(v1[0]);
96      A(v2.GetSize() == 1);
97      c4_View v3 = p2(v1[1]);
98      A(v3.GetSize() == 3);
99      c4_View v4 = p2(v1[2]);
100      A(v4.GetSize() == 2);
101      c4_View v5 = p2(v1[3]);
102      A(v5.GetSize() == 0);
103    }
104  }
105  D(s10a);
106  D(s10b);
107  D(s10c);
108  R(s10a);
109  R(s10b);
110  R(s10c);
111  E;
112
113  B(s11, Commit and rollback, 0)W(s11a);
114   {
115    c4_IntProp p1("p1");
116     {
117      c4_Storage s1("s11a", 1);
118      s1.SetStructure("a[p1:I]");
119      c4_View v1 = s1.View("a");
120      v1.Add(p1[123]);
121      s1.Commit();
122    }
123     {
124      c4_Storage s1("s11a", 0);
125      c4_View v1 = s1.View("a");
126      A(v1.GetSize() == 1);
127      A(p1(v1[0]) == 123);
128      v1.InsertAt(0, p1[234]);
129      A(v1.GetSize() == 2);
130      A(p1(v1[0]) == 234);
131      A(p1(v1[1]) == 123);
132      s1.Rollback();
133      // 19990916 - semantics changed, still 2 rows, but 0 props
134      A(v1.GetSize() == 2);
135      A(v1.NumProperties() == 0);
136      v1 = s1.View("a");
137      A(v1.GetSize() == 1);
138      A(p1(v1[0]) == 123);
139    }
140  }
141  D(s11a);
142  R(s11a);
143  E;
144
145  B(s12, Remove subview, 0)W(s12a);
146   {
147    c4_IntProp p1("p1"), p3("p3");
148    c4_ViewProp p2("p2");
149     {
150      c4_Storage s1("s12a", 1);
151      s1.SetStructure("a[p1:I,p2[p3:I]]");
152      c4_View v1 = s1.View("a");
153      c4_View v2;
154      v2.Add(p3[234]);
155      v1.Add(p1[123] + p2[v2]);
156      s1.Commit();
157    }
158     {
159      c4_Storage s1("s12a", 1);
160      c4_View v1 = s1.View("a");
161      A(v1.GetSize() == 1);
162      A(p1(v1[0]) == 123);
163      c4_View v2 = p2(v1[0]);
164      A(v2.GetSize() == 1);
165      A(p3(v2[0]) == 234);
166      v1.RemoveAt(0);
167      A(v1.GetSize() == 0);
168      s1.Commit();
169      A(v1.GetSize() == 0);
170    }
171  }
172  D(s12a);
173  R(s12a);
174  E;
175
176  B(s13, Remove middle subview, 0)W(s13a);
177   {
178    c4_IntProp p1("p1"), p3("p3");
179    c4_ViewProp p2("p2");
180     {
181      c4_Storage s1("s13a", 1);
182      s1.SetStructure("a[p1:I,p2[p3:I]]");
183      c4_View v1 = s1.View("a");
184
185      c4_View v2a;
186      v2a.Add(p3[234]);
187      v1.Add(p1[123] + p2[v2a]);
188
189      c4_View v2b;
190      v2b.Add(p3[345]);
191      v2b.Add(p3[346]);
192      v1.Add(p1[124] + p2[v2b]);
193
194      c4_View v2c;
195      v2c.Add(p3[456]);
196      v2c.Add(p3[457]);
197      v2c.Add(p3[458]);
198      v1.Add(p1[125] + p2[v2c]);
199
200      s1.Commit();
201    }
202     {
203      c4_Storage s1("s13a", 1);
204      c4_View v1 = s1.View("a");
205      A(v1.GetSize() == 3);
206      A(p1(v1[0]) == 123);
207      A(p1(v1[1]) == 124);
208      A(p1(v1[2]) == 125);
209      c4_View v2a = p2(v1[0]);
210      A(v2a.GetSize() == 1);
211      A(p3(v2a[0]) == 234);
212      c4_View v2b = p2(v1[1]);
213      A(v2b.GetSize() == 2);
214      A(p3(v2b[0]) == 345);
215      c4_View v2c = p2(v1[2]);
216      A(v2c.GetSize() == 3);
217      A(p3(v2c[0]) == 456);
218      v1.RemoveAt(1);
219      A(v1.GetSize() == 2);
220      v2a = p2(v1[0]);
221      A(v2a.GetSize() == 1);
222      A(p3(v2a[0]) == 234);
223      v2b = p2(v1[1]);
224      A(v2b.GetSize() == 3);
225      A(p3(v2b[0]) == 456);
226      s1.Commit();
227      A(v1.GetSize() == 2);
228      A(p1(v1[0]) == 123);
229      A(p1(v1[1]) == 125);
230    }
231  }
232  D(s13a);
233  R(s13a);
234  E;
235
236  B(s14, Replace attached subview, 0)W(s14a);
237   {
238    c4_IntProp p1("p1");
239    c4_ViewProp p2("p2");
240     {
241      c4_Storage s1("s14a", 1);
242      s1.SetStructure("a[p1:I,p2[p3:I]]");
243      c4_View v1 = s1.View("a");
244
245      v1.Add(p1[123] + p2[c4_View()]);
246      A(v1.GetSize() == 1);
247
248      v1[0] = p2[c4_View()];
249      A(v1.GetSize() == 1);
250      A(p1(v1[0]) == 0);
251
252      s1.Commit();
253    }
254  }
255  D(s14a);
256  R(s14a);
257  E;
258
259  B(s15, Add after removed subviews, 0)W(s15a);
260   {
261    c4_IntProp p1("p1"), p3("p3");
262    c4_ViewProp p2("p2");
263     {
264      c4_Storage s1("s15a", 1);
265      s1.SetStructure("a[p1:I,p2[p3:I]]");
266      c4_View v1 = s1.View("a");
267
268      c4_View v2;
269      v2.Add(p3[234]);
270
271      v1.Add(p1[123] + p2[v2]);
272      v1.Add(p1[456] + p2[v2]);
273      v1.Add(p1[789] + p2[v2]);
274      A(v1.GetSize() == 3);
275
276      v1[0] = v1[2];
277      v1.RemoveAt(2);
278
279      v1[0] = v1[1];
280      v1.RemoveAt(1);
281
282      v1.RemoveAt(0);
283
284      v1.Add(p1[111] + p2[v2]);
285
286      s1.Commit();
287    }
288  }
289  D(s15a);
290  R(s15a);
291  E;
292
293  B(s16, Add after removed ints, 0)W(s16a);
294   {
295    c4_IntProp p1("p1");
296
297    c4_Storage s1("s16a", 1);
298    s1.SetStructure("a[p1:I,p2[p3:I]]");
299    c4_View v1 = s1.View("a");
300
301    v1.Add(p1[1]);
302    v1.Add(p1[2]);
303    v1.Add(p1[3]);
304
305    v1.RemoveAt(2);
306    v1.RemoveAt(1);
307    v1.RemoveAt(0);
308
309    v1.Add(p1[4]);
310
311    s1.Commit();
312
313  }
314  D(s16a);
315  R(s16a);
316  E;
317
318  B(s17, Add after removed strings, 0)W(s17a);
319   {
320    c4_StringProp p1("p1");
321
322    c4_Storage s1("s17a", 1);
323    s1.SetStructure("a[p1:S,p2[p3:I]]");
324    c4_View v1 = s1.View("a");
325
326    v1.Add(p1["one"]);
327    v1.Add(p1["two"]);
328    v1.Add(p1["three"]);
329
330    v1.RemoveAt(2);
331    v1.RemoveAt(1);
332    v1.RemoveAt(0);
333
334    v1.Add(p1["four"]);
335
336    s1.Commit();
337
338  }
339  D(s17a);
340  R(s17a);
341  E;
342
343  B(s18, Empty storage, 0)W(s18a);
344   {
345    c4_Storage s1("s18a", 1);
346
347  }
348  D(s18a);
349  R(s18a);
350  E;
351
352  B(s19, Empty view outlives storage, 0)W(s19a);
353   {
354    c4_View v1;
355    c4_Storage s1("s19a", 1);
356    v1 = s1.GetAs("a[p1:I,p2:S]");
357
358  }
359  D(s19a);
360  R(s19a);
361  E;
362}
363