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.
tdepim/akregator/src/mk4storage/metakit/tests/tbasic2.cpp

219 lines
6.4 KiB

// tbasic2.cpp -- Regression test program, basic tests part 2
// $Id$
// This is part of Metakit, the homepage is http://www.equi4.com/metakit/
#include "regress.h"
static int ViewSize(c4_View v)
{
return v.GetSize();
}
void TestBasics2()
{
B(b20, Search sorted view, 0)
{
c4_IntProp p1 ("p1");
c4_StringProp p2 ("p2");
c4_View v1;
v1.Add(p1 [111] + p2 ["one"]);
v1.Add(p1 [222] + p2 ["two"]);
v1.Add(p1 [333] + p2 ["three"]);
v1.Add(p1 [345] + p2 ["four"]);
v1.Add(p1 [234] + p2 ["five"]);
v1.Add(p1 [123] + p2 ["six"]);
c4_View v2 = v1.Sort();
A(v2.GetSize() == 6);
A(p1 (v2[0]) == 111);
A(p1 (v2[1]) == 123);
A(p1 (v2[2]) == 222);
A(p1 (v2[3]) == 234);
A(p1 (v2[4]) == 333);
A(p1 (v2[5]) == 345);
A(v2.Search(p1 [123]) == 1);
A(v2.Search(p1 [100]) == 0);
A(v2.Search(p1 [200]) == 2);
A(v2.Search(p1 [400]) == 6);
c4_View v3 = v1.SortOn(p2);
A(v3.GetSize() == 6);
A(p1 (v3[0]) == 234);
A(p1 (v3[1]) == 345);
A(p1 (v3[2]) == 111);
A(p1 (v3[3]) == 123);
A(p1 (v3[4]) == 333);
A(p1 (v3[5]) == 222);
A(v3.Search(p2 ["six"]) == 3);
A(v3.Search(p2 ["aha"]) == 0);
A(v3.Search(p2 ["gee"]) == 2);
A(v3.Search(p2 ["wow"]) == 6);
c4_View v4 = v1.SortOnReverse(p2, p2);
A(v4.GetSize() == 6);
A(p1 (v4[0]) == 222);
A(p1 (v4[1]) == 333);
A(p1 (v4[2]) == 123);
A(p1 (v4[3]) == 111);
A(p1 (v4[4]) == 345);
A(p1 (v4[5]) == 234);
A(v4.Search(p2 ["six"]) == 2);
A(v4.Search(p2 ["aha"]) == 6);
A(v4.Search(p2 ["gee"]) == 4);
A(v4.Search(p2 ["wow"]) == 0);
} E;
B(b21, Memo property, 0)
{
c4_Row r1;
c4_MemoProp p1 ("p1");
c4_Bytes x1 ("hi!", 3);
p1 (r1) = x1;
c4_Bytes x2 = p1 (r1);
A(x1 == x2);
} E;
B(b22, Stored view references, 0)
{
c4_ViewProp p1 ("p1");
c4_View v1;
{
v1.Add(p1 [c4_View ()]);
}
// this works
int n = ViewSize(p1.Get(v1[0]));
A(n == 0);
// this fails in 1.8b2 using MSVC 1.52 (tq_wvus)
//
// The compiler destructs temp c4_View once too often, or
// what's more likely, fails to call the constructor once.
//
// So for MSVC 1.52: use prop.Get(rowref) for subviews,
// or immediately assign the result to a c4_View object,
// do not pass a "prop (rowref)" expression as argument.
#if _MSC_VER != 800
int m = ViewSize(p1 (v1[0]));
A(m == 0);
#endif
} E;
B(b23, Sort comparison fix, 0) // 1.9e: compare buffering problem
{
c4_DoubleProp p1 ("p1");
c4_View v1;
for (int i = 0; i < 100; ++i)
v1.Add(p1 [99-i]);
c4_View v2 = v1.Sort();
A(v2.GetSize() == 100);
for (int j = 0; j < 100; ++j)
{
A(p1 (v1[j]) == (double) 99-j);
A(p1 (v2[j]) == (double) j);
}
} E;
B(b24, Custom view comparisons, 0) // 1.9f: more compare cache problems
{
c4_IntProp p1 ("p1");
c4_FloatProp p2 ("p2");
c4_DoubleProp p3 ("p3");
c4_IntProp p4 ("p4");
c4_View v1;
v1.Add(p1 [2] + p2 [2] + p3 [2]);
v1.Add(p1 [1] + p2 [1] + p3 [1]);
v1.Add(p1 [3] + p2 [3] + p3 [3]);
A(v1.GetSize() == 3);
A((int) p1 (v1[0]) > (int) p1 (v1[1]));
A((float) p2 (v1[0]) > (float) p2 (v1[1]));
A((double) p3 (v1[0]) > (double) p3 (v1[1]));
A((int) p1 (v1[0]) < (int) p1 (v1[2]));
A((float) p2 (v1[0]) < (float) p2 (v1[2]));
A((double) p3 (v1[0]) < (double) p3 (v1[2]));
c4_View v2 = v1.Unique();
A(v2.GetSize() == 3);
A((int) p1 (v2[0]) != (int) p1 (v2[1]));
A((float) p2 (v2[0]) != (float) p2 (v2[1]));
A((double) p3 (v2[0]) != (double) p3 (v2[1]));
A((int) p1 (v2[0]) != (int) p1 (v2[2]));
A((float) p2 (v2[0]) != (float) p2 (v2[2]));
A((double) p3 (v2[0]) != (double) p3 (v2[2]));
v1.Add(p1 [2] + p2 [2] + p3 [2]);
v1.Add(p1 [1] + p2 [1] + p3 [1]);
v1.Add(p1 [3] + p2 [3] + p3 [3]);
c4_View v3 = v1.Unique();
A(v3.GetSize() == 3);
A((int) p1 (v3[0]) != (int) p1 (v3[1]));
A((float) p2 (v3[0]) != (float) p2 (v3[1]));
A((double) p3 (v3[0]) != (double) p3 (v3[1]));
A((int) p1 (v3[0]) != (int) p1 (v3[2]));
A((float) p2 (v3[0]) != (float) p2 (v3[2]));
A((double) p3 (v3[0]) != (double) p3 (v3[2]));
c4_View v4 = v1.Counts(p1, p4);
A(v4.GetSize() == 3);
c4_View v5 = v1.Counts(p2, p4);
A(v5.GetSize() == 3); // this failed in 1.9f
c4_View v6 = v1.Counts(p3, p4);
A(v6.GetSize() == 3); // this failed in 1.9f
} E;
B(b25, Copy row from derived, 0)
{
c4_IntProp p1 ("p1");
c4_View v1;
v1.Add(p1 [111]);
v1.Add(p1 [222]);
v1.Add(p1 [333]);
c4_View v2 = v1.Select(p1 [222]);
A(v2.GetSize() == 1);
A(p1 (v2[0]) == 222);
c4_Row r = v2[0];
A(p1 (r) == 222); // 1.9g: failed because SetAt did not remap
} E;
B(b26, Partial memo field access, 0)
{
c4_BytesProp p1 ("p1");
c4_View v1;
v1.Add(p1 [c4_Bytes ("12345", 5)]);
A(v1.GetSize() == 1);
c4_Bytes buf = p1 (v1[0]);
A(buf.Size() == 5);
A(buf == c4_Bytes ("12345", 5));
buf = p1(v1[0]).Access(1,3);
A(buf == c4_Bytes ("234", 3));
p1 (v1[0]).Modify(c4_Bytes ("ab", 2), 2, 0);
buf = p1 (v1[0]);
A(buf == c4_Bytes ("12ab5", 5));
p1 (v1[0]).Modify(c4_Bytes ("ABC", 3), 1, 2);
buf = p1 (v1[0]);
A(buf == c4_Bytes ("1ABCab5", 7));
p1 (v1[0]).Modify(c4_Bytes ("xyz", 3), 2, -2);
buf = p1 (v1[0]);
A(buf == c4_Bytes ("1Axyz", 5));
p1 (v1[0]).Modify(c4_Bytes ("3456", 4), 4, 0);
buf = p1 (v1[0]);
A(buf == c4_Bytes ("1Axy3456", 8));
} E;
B(b27, Copy value to another row, 0)
{
c4_StringProp p1 ("p1");
c4_View v1;
v1.SetSize(2);
p1 (v1[1]) = "abc";
// next assert fails in MacOS X 10.2.1 "Jaguar" with 2.4.7
// seems bug in gcc 3.1, -O i.s.o. -O2 works [jcw 21oct02]
A((const char*) (p1 (v1[0])) == (c4_String) "");
A((const char*) (p1 (v1[1])) == (c4_String) "abc");
// fails in 2.4.0, reported by Jerry McRae, August 2001
p1 (v1[0]) = (const char*) p1 (v1[1]);
// MacOS 10.2.3 gcc 3.1 dec 2002 is still weird, inserting the
// following code (which should be a noop) *fixes* the assert!
//const char* q = p1 (v1[1]);
A((c4_String)(const char*) (p1 (v1[0])) == (c4_String) "abc");
} E;
}