You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
367 lines
8.2 KiB
367 lines
8.2 KiB
// tstore3.cpp -- Regression test program, storage tests, part 3
|
|
// $Id$
|
|
// This is part of Metakit, the homepage is http://www.equi4.com/metakit/
|
|
|
|
#include "regress.h"
|
|
|
|
void TestStores3()
|
|
{
|
|
B(s20, View outlives storage, 0) W(s20a);
|
|
{
|
|
c4_IntProp p1 ("p1");
|
|
c4_View v1;
|
|
|
|
{
|
|
c4_Storage s1 ("s20a", 1);
|
|
v1 = s1.GetAs("a[p1:I,p2:S]");
|
|
v1.Add(p1 [123]);
|
|
}
|
|
|
|
// 19990916 - semantics changed, rows kept but no properties
|
|
//A(p1 (v1[0]) == 123);
|
|
A(v1.GetSize() == 1);
|
|
A(v1.NumProperties() == 0);
|
|
|
|
} D(s20a); R(s20a); E;
|
|
|
|
B(s21, Test demo scenario, 0) W(s21a);
|
|
{
|
|
c4_StringProp p1 ("p1"), p2 ("p2");
|
|
{
|
|
c4_Storage storage ("s21a", 1);
|
|
storage.SetStructure("a[p1:S,p2:S]");
|
|
c4_View v1;
|
|
c4_Row r1;
|
|
|
|
p1 (r1) = "One";
|
|
p2 (r1) = "Un";
|
|
v1.Add(r1);
|
|
A(v1.GetSize() == 1);
|
|
|
|
p1 (r1) = "Two";
|
|
p2 (r1) = "Deux";
|
|
v1.Add(r1);
|
|
A(v1.GetSize() == 2);
|
|
|
|
// changed 2000-03-15: Store is gone
|
|
//v1 = storage.Store("a", v1);
|
|
v1 = storage.View("a") = v1;
|
|
|
|
A(v1.GetSize() == 2);
|
|
A(p1 (v1[1]) == (c4_String) "Two");
|
|
A(p2 (v1[1]) == (c4_String) "Deux");
|
|
A(p1 (v1[0]) == (c4_String) "One");
|
|
A(p2 (v1[0]) == (c4_String) "Un");
|
|
|
|
storage.Commit();
|
|
A(v1.GetSize() == 2);
|
|
A(p1 (v1[1]) == (c4_String) "Two");
|
|
A(p2 (v1[1]) == (c4_String) "Deux");
|
|
A(p1 (v1[0]) == (c4_String) "One");
|
|
A(p2 (v1[0]) == (c4_String) "Un");
|
|
|
|
c4_String s1 (p1 (v1[1]));
|
|
c4_String s2 (p2 (v1[1]));
|
|
A(s1 == "Two");
|
|
A(s2 == "Deux");
|
|
|
|
storage.Commit();
|
|
|
|
v1.Add(p1 ["Three"] + p2 ["Trois"]);
|
|
|
|
storage.Commit();
|
|
A(v1.GetSize() == 3);
|
|
A(p2 (v1[2]) == (c4_String) "Trois");
|
|
|
|
v1 = storage.GetAs("a[p1:S,p2:S,p3:I]");
|
|
A(v1.GetSize() == 3);
|
|
A(p2 (v1[2]) == (c4_String) "Trois");
|
|
|
|
c4_IntProp p3 ("p3");
|
|
p3 (v1[1]) = 123;
|
|
|
|
storage.Commit();
|
|
A(v1.GetSize() == 3);
|
|
A(p2 (v1[2]) == (c4_String) "Trois");
|
|
|
|
c4_View v2 = storage.GetAs("b[p4:I]");
|
|
|
|
c4_IntProp p4 ("p4");
|
|
v2.Add(p4 [234]);
|
|
|
|
storage.Commit();
|
|
A(v1.GetSize() == 3);
|
|
A(p2 (v1[2]) == (c4_String) "Trois");
|
|
|
|
c4_IntProp p4a ("p4");
|
|
v1.InsertAt(2, p1 ["Four"] + p4a [345]);
|
|
|
|
storage.Commit();
|
|
A(v1.GetSize() == 4);
|
|
A(p1 (v1[0]) == (c4_String) "One");
|
|
A(p1 (v1[1]) == (c4_String) "Two");
|
|
A(p1 (v1[2]) == (c4_String) "Four");
|
|
A(p1 (v1[3]) == (c4_String) "Three");
|
|
A(p2 (v1[3]) == (c4_String) "Trois");
|
|
A(v2.GetSize() == 1);
|
|
A(p4 (v2[0]) == 234);
|
|
}
|
|
{
|
|
c4_Storage storage ("s21a", 0);
|
|
c4_View v1 = storage.View("a");
|
|
A(v1.GetSize() == 4);
|
|
A(p1 (v1[0]) == (c4_String) "One");
|
|
A(p1 (v1[1]) == (c4_String) "Two");
|
|
A(p1 (v1[2]) == (c4_String) "Four");
|
|
A(p1 (v1[3]) == (c4_String) "Three");
|
|
c4_View v2 = storage.View("b");
|
|
c4_IntProp p4 ("p4");
|
|
A(v2.GetSize() == 1);
|
|
A(p4 (v2[0]) == 234);
|
|
}
|
|
} D(s21a); R(s21a); E;
|
|
|
|
#if !q4_TINY
|
|
B(s22, Double storage, 0) W(s22a);
|
|
{
|
|
c4_DoubleProp p1 ("p1");
|
|
c4_Storage s1 ("s22a", 1);
|
|
s1.SetStructure("a[p1:D]");
|
|
c4_View v1 = s1.View("a");
|
|
v1.Add(p1 [1234.5678]);
|
|
v1.Add(p1 [2345.6789]);
|
|
v1.InsertAt(1, p1 [3456.7890]);
|
|
s1.Commit();
|
|
} D(s22a); R(s22a); E;
|
|
#endif
|
|
|
|
B(s23, Find absent record, 0) W(s23a);
|
|
{
|
|
c4_Storage s1 ("s23a", 1);
|
|
s1.SetStructure("v[h:S,p:I,a:I,b:I,c:I,d:I,e:I,f:I,g:I,x:I]");
|
|
c4_View view = s1.View("v");
|
|
|
|
c4_StringProp H("h");
|
|
c4_IntProp P("p");
|
|
|
|
c4_Row row;
|
|
H(row) = "someString";
|
|
P(row) = 99;
|
|
|
|
int x = view.Find(row);
|
|
A(x == -1);
|
|
|
|
} D(s23a); R(s23a); E;
|
|
|
|
B(s24, Bitwise storage, 0) W(s24a);
|
|
{
|
|
c4_IntProp p1 ("p1");
|
|
|
|
int m = 9;
|
|
|
|
// insert values in front, but check fractional sizes at each step
|
|
for (int n = 0; n < m; ++n)
|
|
{
|
|
{
|
|
c4_Storage s1 ("s24a", 1);
|
|
s1.SetStructure("a1[p1:I],a2[p1:I],a3[p1:I],a4[p1:I]");
|
|
s1.AutoCommit(); // new feature in 1.6
|
|
|
|
c4_View v1 = s1.View("a1");
|
|
c4_View v2 = s1.View("a2");
|
|
c4_View v3 = s1.View("a3");
|
|
c4_View v4 = s1.View("a4");
|
|
|
|
c4_Row row;
|
|
int k = ~ n;
|
|
|
|
p1 (row) = k & 0x01;
|
|
v1.InsertAt(0, row);
|
|
|
|
p1 (row) = k & 0x03;
|
|
v2.InsertAt(0, row);
|
|
|
|
p1 (row) = k & 0x0F;
|
|
v3.InsertAt(0, row);
|
|
|
|
p1 (row) = k & 0x7F;
|
|
v4.InsertAt(0, row);
|
|
}
|
|
// the following checks that all tiny size combinations work
|
|
{
|
|
c4_Storage s1 ("s24a", 0);
|
|
|
|
c4_View v1 = s1.View("a1");
|
|
c4_View v2 = s1.View("a2");
|
|
c4_View v3 = s1.View("a3");
|
|
c4_View v4 = s1.View("a4");
|
|
|
|
A(v1.GetSize() == n + 1);
|
|
A(v2.GetSize() == n + 1);
|
|
A(v3.GetSize() == n + 1);
|
|
A(v4.GetSize() == n + 1);
|
|
}
|
|
}
|
|
|
|
c4_Storage s1 ("s24a", 0);
|
|
|
|
c4_View v1 = s1.View("a1");
|
|
c4_View v2 = s1.View("a2");
|
|
c4_View v3 = s1.View("a3");
|
|
c4_View v4 = s1.View("a4");
|
|
|
|
A(v1.GetSize() == m);
|
|
A(v2.GetSize() == m);
|
|
A(v3.GetSize() == m);
|
|
A(v4.GetSize() == m);
|
|
|
|
// now check that the inserted values are correct
|
|
for (int i = 0; i < m; ++i)
|
|
{
|
|
int j = m - i - 1;
|
|
int k = ~ i;
|
|
|
|
A(p1 (v1[j]) == (k & 0x01));
|
|
A(p1 (v2[j]) == (k & 0x03));
|
|
A(p1 (v3[j]) == (k & 0x0F));
|
|
A(p1 (v4[j]) == (k & 0x7F));
|
|
}
|
|
|
|
} D(s24a); R(s24a); E;
|
|
|
|
B(s25, Bytes storage, 0) W(s25a);
|
|
{
|
|
c4_Bytes hi ("hi", 2);
|
|
c4_Bytes gday ("gday", 4);
|
|
c4_Bytes hello ("hello", 5);
|
|
|
|
c4_BytesProp p1 ("p1");
|
|
c4_Storage s1 ("s25a", 1);
|
|
s1.SetStructure("a[p1:B]");
|
|
c4_View v1 = s1.View("a");
|
|
|
|
v1.Add(p1 [hi]);
|
|
A(p1 (v1[0]) == hi);
|
|
v1.Add(p1 [hello]);
|
|
A(p1 (v1[0]) == hi);
|
|
A(p1 (v1[1]) == hello);
|
|
v1.InsertAt(1, p1 [gday]);
|
|
A(p1 (v1[0]) == hi);
|
|
A(p1 (v1[1]) == gday);
|
|
A(p1 (v1[2]) == hello);
|
|
s1.Commit();
|
|
A(p1 (v1[0]) == hi);
|
|
A(p1 (v1[1]) == gday);
|
|
A(p1 (v1[2]) == hello);
|
|
|
|
} D(s25a); R(s25a); E;
|
|
|
|
B(s26, Bitwise autosizing, 0) W(s26a);
|
|
{
|
|
c4_IntProp p1 ("p1"), p2 ("p2"), p3 ("p3"), p4 ("p4");
|
|
c4_Storage s1 ("s26a", 1);
|
|
s1.SetStructure("a[p1:I,p2:I,p3:I,p4:I]");
|
|
c4_View v1 = s1.View("a");
|
|
|
|
v1.Add(p1 [1] + p2 [3] + p3 [15] + p4 [127]);
|
|
A(p1 (v1[0]) == 1);
|
|
A(p2 (v1[0]) == 3);
|
|
A(p3 (v1[0]) == 15);
|
|
A(p4 (v1[0]) == 127);
|
|
|
|
p1 (v1[0]) = 100000L;
|
|
p2 (v1[0]) = 100000L;
|
|
p3 (v1[0]) = 100000L;
|
|
p4 (v1[0]) = 100000L;
|
|
|
|
// these failed in 1.61
|
|
A(p1 (v1[0]) == 100000L);
|
|
A(p2 (v1[0]) == 100000L);
|
|
A(p3 (v1[0]) == 100000L);
|
|
A(p4 (v1[0]) == 100000L);
|
|
|
|
s1.Commit();
|
|
|
|
} D(s26a); R(s26a); E;
|
|
|
|
B(s27, Bytes restructuring, 0) W(s27a);
|
|
{
|
|
c4_Bytes test ("test", 4);
|
|
|
|
c4_BytesProp p1 ("p1");
|
|
c4_Storage s1 ("s27a", 1);
|
|
|
|
c4_Row row;
|
|
p1 (row) = test;
|
|
|
|
c4_View v1;
|
|
v1.Add(row);
|
|
|
|
// changed 2000-03-15: Store is gone
|
|
//s1.Store("a", v1); // asserts in 1.61
|
|
c4_View v2 = s1.GetAs("a[p1:B]");
|
|
v2.InsertAt(0, v1);
|
|
|
|
s1.Commit();
|
|
|
|
} D(s27a); R(s27a); E;
|
|
|
|
#if !q4_TINY
|
|
B(s28, Doubles added later, 0) W(s28a);
|
|
{
|
|
c4_FloatProp p1 ("p1");
|
|
c4_DoubleProp p2 ("p2");
|
|
c4_ViewProp p3 ("p3");
|
|
|
|
c4_Storage s1 ("s28a", 1);
|
|
s1.SetStructure("a[p1:F,p2:D,p3[p1:F,p2:D]]");
|
|
c4_View v1 = s1.View("a");
|
|
|
|
c4_Row r1;
|
|
|
|
p1 (r1) = 123;
|
|
p2 (r1) = 123;
|
|
|
|
c4_View v2;
|
|
v2.Add (p1 [234] + p2 [234]);
|
|
p3 (r1) = v2;
|
|
|
|
v1.Add(r1);
|
|
double x1 = p1 (v1[0]);
|
|
A(x1 == p2 (v1[0]));
|
|
|
|
v2 = p3 (v1[0]);
|
|
double x2 = p1 (v2[0]);
|
|
A(x2 == p2 (v2[0])); // fails in 1.6
|
|
|
|
s1.Commit();
|
|
|
|
} D(s28a); R(s28a); E;
|
|
#endif
|
|
|
|
B(s29, Delete bytes property, 0) W(s29a);
|
|
{
|
|
{
|
|
c4_BytesProp p1 ("p1");
|
|
|
|
c4_Storage s1 ("s29a", 1);
|
|
s1.SetStructure("a[p1:B]");
|
|
c4_View v1 = s1.View("a");
|
|
|
|
int data = 99;
|
|
v1.Add(p1 [c4_Bytes (&data, sizeof data)]);
|
|
|
|
s1.Commit();
|
|
}
|
|
{
|
|
c4_Storage s1 ("s29a", 1);
|
|
c4_View v1 = s1.View("a");
|
|
|
|
v1.RemoveAt(0); // asserts in 1.7
|
|
|
|
s1.Commit();
|
|
}
|
|
|
|
} D(s29a); R(s29a); E;
|
|
}
|