1// tstore3.cpp -- Regression test program, storage tests, part 3
2// $Id: tstore3.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 TestStores3() {
8  B(s20, View outlives storage, 0)W(s20a);
9   {
10    c4_IntProp p1("p1");
11    c4_View v1;
12
13     {
14      c4_Storage s1("s20a", 1);
15      v1 = s1.GetAs("a[p1:I,p2:S]");
16      v1.Add(p1[123]);
17    }
18
19    // 19990916 - semantics changed, rows kept but no properties
20    //A(p1 (v1[0]) == 123);
21    A(v1.GetSize() == 1);
22    A(v1.NumProperties() == 0);
23
24  }
25  D(s20a);
26  R(s20a);
27  E;
28
29  B(s21, Test demo scenario, 0)W(s21a);
30   {
31    c4_StringProp p1("p1"), p2("p2");
32     {
33      c4_Storage storage("s21a", 1);
34      storage.SetStructure("a[p1:S,p2:S]");
35      c4_View v1;
36      c4_Row r1;
37
38      p1(r1) = "One";
39      p2(r1) = "Un";
40      v1.Add(r1);
41      A(v1.GetSize() == 1);
42
43      p1(r1) = "Two";
44      p2(r1) = "Deux";
45      v1.Add(r1);
46      A(v1.GetSize() == 2);
47
48      // changed 2000-03-15: Store is gone
49      //v1 = storage.Store("a", v1);
50      v1 = storage.View("a") = v1;
51
52      A(v1.GetSize() == 2);
53      A(p1(v1[1]) == (c4_String)"Two");
54      A(p2(v1[1]) == (c4_String)"Deux");
55      A(p1(v1[0]) == (c4_String)"One");
56      A(p2(v1[0]) == (c4_String)"Un");
57
58      storage.Commit();
59      A(v1.GetSize() == 2);
60      A(p1(v1[1]) == (c4_String)"Two");
61      A(p2(v1[1]) == (c4_String)"Deux");
62      A(p1(v1[0]) == (c4_String)"One");
63      A(p2(v1[0]) == (c4_String)"Un");
64
65      c4_String s1(p1(v1[1]));
66      c4_String s2(p2(v1[1]));
67      A(s1 == "Two");
68      A(s2 == "Deux");
69
70      storage.Commit();
71
72      v1.Add(p1["Three"] + p2["Trois"]);
73
74      storage.Commit();
75      A(v1.GetSize() == 3);
76      A(p2(v1[2]) == (c4_String)"Trois");
77
78      v1 = storage.GetAs("a[p1:S,p2:S,p3:I]");
79      A(v1.GetSize() == 3);
80      A(p2(v1[2]) == (c4_String)"Trois");
81
82      c4_IntProp p3("p3");
83      p3(v1[1]) = 123;
84
85      storage.Commit();
86      A(v1.GetSize() == 3);
87      A(p2(v1[2]) == (c4_String)"Trois");
88
89      c4_View v2 = storage.GetAs("b[p4:I]");
90
91      c4_IntProp p4("p4");
92      v2.Add(p4[234]);
93
94      storage.Commit();
95      A(v1.GetSize() == 3);
96      A(p2(v1[2]) == (c4_String)"Trois");
97
98      c4_IntProp p4a("p4");
99      v1.InsertAt(2, p1["Four"] + p4a[345]);
100
101      storage.Commit();
102      A(v1.GetSize() == 4);
103      A(p1(v1[0]) == (c4_String)"One");
104      A(p1(v1[1]) == (c4_String)"Two");
105      A(p1(v1[2]) == (c4_String)"Four");
106      A(p1(v1[3]) == (c4_String)"Three");
107      A(p2(v1[3]) == (c4_String)"Trois");
108      A(v2.GetSize() == 1);
109      A(p4(v2[0]) == 234);
110    }
111     {
112      c4_Storage storage("s21a", 0);
113      c4_View v1 = storage.View("a");
114      A(v1.GetSize() == 4);
115      A(p1(v1[0]) == (c4_String)"One");
116      A(p1(v1[1]) == (c4_String)"Two");
117      A(p1(v1[2]) == (c4_String)"Four");
118      A(p1(v1[3]) == (c4_String)"Three");
119      c4_View v2 = storage.View("b");
120      c4_IntProp p4("p4");
121      A(v2.GetSize() == 1);
122      A(p4(v2[0]) == 234);
123    }
124  }
125  D(s21a);
126  R(s21a);
127  E;
128
129#if !q4_TINY
130  B(s22, Double storage, 0)W(s22a);
131   {
132    c4_DoubleProp p1("p1");
133    c4_Storage s1("s22a", 1);
134    s1.SetStructure("a[p1:D]");
135    c4_View v1 = s1.View("a");
136    v1.Add(p1[1234.5678]);
137    v1.Add(p1[2345.6789]);
138    v1.InsertAt(1, p1[3456.7890]);
139    s1.Commit();
140  }
141  D(s22a);
142  R(s22a);
143  E;
144#endif
145
146  B(s23, Find absent record, 0)W(s23a);
147   {
148    c4_Storage s1("s23a", 1);
149    s1.SetStructure("v[h:S,p:I,a:I,b:I,c:I,d:I,e:I,f:I,g:I,x:I]");
150    c4_View view = s1.View("v");
151
152    c4_StringProp H("h");
153    c4_IntProp P("p");
154
155    c4_Row row;
156    H(row) = "someString";
157    P(row) = 99;
158
159    int x = view.Find(row);
160    A(x ==  - 1);
161
162  }
163  D(s23a);
164  R(s23a);
165  E;
166
167  B(s24, Bitwise storage, 0)W(s24a);
168   {
169    c4_IntProp p1("p1");
170
171    int m = 9;
172
173    // insert values in front, but check fractional sizes at each step
174    for (int n = 0; n < m; ++n) {
175       {
176        c4_Storage s1("s24a", 1);
177        s1.SetStructure("a1[p1:I],a2[p1:I],a3[p1:I],a4[p1:I]");
178        s1.AutoCommit(); // new feature in 1.6
179
180        c4_View v1 = s1.View("a1");
181        c4_View v2 = s1.View("a2");
182        c4_View v3 = s1.View("a3");
183        c4_View v4 = s1.View("a4");
184
185        c4_Row row;
186        int k = ~n;
187
188        p1(row) = k &0x01;
189        v1.InsertAt(0, row);
190
191        p1(row) = k &0x03;
192        v2.InsertAt(0, row);
193
194        p1(row) = k &0x0F;
195        v3.InsertAt(0, row);
196
197        p1(row) = k &0x7F;
198        v4.InsertAt(0, row);
199      }
200      // the following checks that all tiny size combinations work
201       {
202        c4_Storage s1("s24a", 0);
203
204        c4_View v1 = s1.View("a1");
205        c4_View v2 = s1.View("a2");
206        c4_View v3 = s1.View("a3");
207        c4_View v4 = s1.View("a4");
208
209        A(v1.GetSize() == n + 1);
210        A(v2.GetSize() == n + 1);
211        A(v3.GetSize() == n + 1);
212        A(v4.GetSize() == n + 1);
213      }
214    }
215
216    c4_Storage s1("s24a", 0);
217
218    c4_View v1 = s1.View("a1");
219    c4_View v2 = s1.View("a2");
220    c4_View v3 = s1.View("a3");
221    c4_View v4 = s1.View("a4");
222
223    A(v1.GetSize() == m);
224    A(v2.GetSize() == m);
225    A(v3.GetSize() == m);
226    A(v4.GetSize() == m);
227
228    // now check that the inserted values are correct
229    for (int i = 0; i < m; ++i) {
230      int j = m - i - 1;
231      int k = ~i;
232
233      A(p1(v1[j]) == (k &0x01));
234      A(p1(v2[j]) == (k &0x03));
235      A(p1(v3[j]) == (k &0x0F));
236      A(p1(v4[j]) == (k &0x7F));
237    }
238
239  }
240  D(s24a);
241  R(s24a);
242  E;
243
244  B(s25, Bytes storage, 0)W(s25a);
245   {
246    c4_Bytes hi("hi", 2);
247    c4_Bytes gday("gday", 4);
248    c4_Bytes hello("hello", 5);
249
250    c4_BytesProp p1("p1");
251    c4_Storage s1("s25a", 1);
252    s1.SetStructure("a[p1:B]");
253    c4_View v1 = s1.View("a");
254
255    v1.Add(p1[hi]);
256    A(p1(v1[0]) == hi);
257    v1.Add(p1[hello]);
258    A(p1(v1[0]) == hi);
259    A(p1(v1[1]) == hello);
260    v1.InsertAt(1, p1[gday]);
261    A(p1(v1[0]) == hi);
262    A(p1(v1[1]) == gday);
263    A(p1(v1[2]) == hello);
264    s1.Commit();
265    A(p1(v1[0]) == hi);
266    A(p1(v1[1]) == gday);
267    A(p1(v1[2]) == hello);
268
269  }
270  D(s25a);
271  R(s25a);
272  E;
273
274  B(s26, Bitwise autosizing, 0)W(s26a);
275   {
276    c4_IntProp p1("p1"), p2("p2"), p3("p3"), p4("p4");
277    c4_Storage s1("s26a", 1);
278    s1.SetStructure("a[p1:I,p2:I,p3:I,p4:I]");
279    c4_View v1 = s1.View("a");
280
281    v1.Add(p1[1] + p2[3] + p3[15] + p4[127]);
282    A(p1(v1[0]) == 1);
283    A(p2(v1[0]) == 3);
284    A(p3(v1[0]) == 15);
285    A(p4(v1[0]) == 127);
286
287    p1(v1[0]) = 100000L;
288    p2(v1[0]) = 100000L;
289    p3(v1[0]) = 100000L;
290    p4(v1[0]) = 100000L;
291
292    // these failed in 1.61
293    A(p1(v1[0]) == 100000L);
294    A(p2(v1[0]) == 100000L);
295    A(p3(v1[0]) == 100000L);
296    A(p4(v1[0]) == 100000L);
297
298    s1.Commit();
299
300  }
301  D(s26a);
302  R(s26a);
303  E;
304
305  B(s27, Bytes restructuring, 0)W(s27a);
306   {
307    c4_Bytes test("test", 4);
308
309    c4_BytesProp p1("p1");
310    c4_Storage s1("s27a", 1);
311
312    c4_Row row;
313    p1(row) = test;
314
315    c4_View v1;
316    v1.Add(row);
317
318    // changed 2000-03-15: Store is gone
319    //s1.Store("a", v1); // asserts in 1.61
320    c4_View v2 = s1.GetAs("a[p1:B]");
321    v2.InsertAt(0, v1);
322
323    s1.Commit();
324
325  }
326  D(s27a);
327  R(s27a);
328  E;
329
330#if !q4_TINY
331  B(s28, Doubles added later, 0)W(s28a);
332   {
333    c4_FloatProp p1("p1");
334    c4_DoubleProp p2("p2");
335    c4_ViewProp p3("p3");
336
337    c4_Storage s1("s28a", 1);
338    s1.SetStructure("a[p1:F,p2:D,p3[p1:F,p2:D]]");
339    c4_View v1 = s1.View("a");
340
341    c4_Row r1;
342
343    p1(r1) = 123;
344    p2(r1) = 123;
345
346    c4_View v2;
347    v2.Add(p1[234] + p2[234]);
348    p3(r1) = v2;
349
350    v1.Add(r1);
351    double x1 = p1(v1[0]);
352    A(x1 == p2(v1[0]));
353
354    v2 = p3(v1[0]);
355    double x2 = p1(v2[0]);
356    A(x2 == p2(v2[0])); // fails in 1.6
357
358    s1.Commit();
359
360  }
361  D(s28a);
362  R(s28a);
363  E;
364#endif
365
366  B(s29, Delete bytes property, 0)W(s29a);
367   {
368     {
369      c4_BytesProp p1("p1");
370
371      c4_Storage s1("s29a", 1);
372      s1.SetStructure("a[p1:B]");
373      c4_View v1 = s1.View("a");
374
375      int data = 99;
376      v1.Add(p1[c4_Bytes(&data, sizeof data)]);
377
378      s1.Commit();
379    }
380     {
381      c4_Storage s1("s29a", 1);
382      c4_View v1 = s1.View("a");
383
384      v1.RemoveAt(0); // asserts in 1.7
385
386      s1.Commit();
387    }
388
389  }
390  D(s29a);
391  R(s29a);
392  E;
393}
394