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/regress.cpp

270 lines
5.5 KiB

// regress.cpp -- Regression test program, main code
// $Id$
// This is part of Metakit, the homepage is http://www.equi4.com/metakit/
#include "regress.h"
#if defined (macintosh)
#include <SIOUX.h>
#ifdef DEBUG_NEW
#include <DebugNew.cp>
//#include "ZoneRanger.c"
#if DEBUG_NEW >= 2 && !defined (q4_MAC_LEAK_CHECK)
#define q4_MAC_LEAK_CHECK 1
#endif
#endif
#endif
#if __profile__
#define q4_MWCW_PROFILER 1
#include <profiler.h>
#endif
#if q4_NOTHROW
const char* msg;
#endif
#if _WIN32_WCE
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
int remove(const char* fn_)
{
c4_Bytes buffer;
int n = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, fn_, -1, NULL, 0);
wchar_t* w = (wchar_t*) buffer.SetBufferClear((n+1) * sizeof (wchar_t));
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, fn_, -1, w, n);
return DeleteFile((wchar_t*) buffer.Contents()) ? 0 : -1;
}
#endif
int
#if _WIN32_WCE
_cdecl
#endif
main()
{
// afxMemDF |= allocMemDF | checkAlwaysMemDF;
// The M4STRING package sometimes keeps a spare empty string around.
// By allocating it here, we avoid a few bogus memory leak reports.
c4_String empty;
#if q4_MAC_LEAK_CHECK
DebugNewForgetLeaks();
#endif
#if q4_MWCW_PROFILER
if (!ProfilerInit(collectDetailed, bestTimeBase, 20, 5))
{
#endif
TestBasics1();
TestBasics2();
TestNotify();
TestCustom1();
TestCustom2();
TestResize();
TestStores1();
TestStores2();
TestStores3();
TestStores4();
TestStores5();
TestDiffer();
TestExtend();
TestFormat();
TestMapped();
TestLimits();
#if q4_MWCW_PROFILER
ProfilerDump("\pRegress.prof");
ProfilerTerm();
}
#endif
#if defined (_DEBUG)
fputs("\nPress return... ", stderr);
getchar();
#endif
#if q4_MAC_LEAK_CHECK
if (DebugNewReportLeaks())
fputs(" *** Memory leaks found ***\n", stderr);
#endif
#if defined (macintosh)
SIOUXSettings.asktosaveonclose = false;
#endif
fputs("Done.\n", stderr);
return 0;
}
// Recursively display the entire view contents. The results shown do not
// depend on file tqlayout (free space, file positions, flat vs. on-demand).
static void ViewDisplay(const c4_View& v_, FILE* fp, int l_ =0)
{
c4_String types;
bool hasData = false, hasSubs = false;
// display header info and collect all data types
fprintf(fp, "%*s VIEW %5d rows =", l_, "", v_.GetSize());
for (int n = 0; n < v_.NumProperties(); ++n)
{
c4_Property prop = v_.NthProperty(n);
char t = prop.Type();
fprintf(fp, " %s:%c", (const char*) prop.Name(), t);
types += t;
if (t == 'V')
hasSubs = true;
else
hasData = true;
}
fprintf(fp, "\n");
for (int j = 0; j < v_.GetSize(); ++j)
{
if (hasData) // data properties are all shown on the same line
{
fprintf(fp, "%*s %4d:", l_, "", j);
c4_RowRef r = v_[j];
for (int k = 0; k < types.GetLength(); ++k)
{
c4_Property p = v_.NthProperty(k);
switch (types[k])
{
case 'I':
fprintf(fp, " %ld", (long) ((c4_IntProp&) p) (r));
break;
#if !q4_TINY
case 'F':
fprintf(fp, " %g", (double) ((c4_FloatProp&) p) (r));
break;
case 'D':
fprintf(fp, " %.12g", (double) ((c4_DoubleProp&) p) (r));
break;
#endif
case 'S':
fprintf(fp, " '%s'", (const char*) ((c4_StringProp&) p) (r));
break;
case 'M': // backward compatibility
case 'B':
fprintf(fp, " (%db)", (p (r)).GetSize());
break;
default:
if (types[k] != 'V')
fprintf(fp, " (%c?)", types[k]);
}
}
fprintf(fp, "\n");
}
if (hasSubs) // subviews are then shown, each as a separate block
{
for (int k = 0; k < types.GetLength(); ++k)
{
if (types[k] == 'V')
{
c4_Property prop = v_.NthProperty(k);
fprintf(fp, "%*s %4d: subview '%s'\n", l_, "", j,
(const char*) prop.Name());
c4_ViewProp& vp = (c4_ViewProp&) prop;
ViewDisplay(vp (v_[j]), fp, l_ + 2);
}
}
}
}
}
void DumpFile(const char* in_, const char* out_)
{
FILE* fp = fopen(out_, TEXTOUT);
A(fp);
c4_Storage store (in_, 0);
ViewDisplay(store, fp);
fclose(fp);
}
void Fail(const char* msg)
{
#if q4_NOTHROW
fprintf(stderr, "\t%s\n", msg);
printf("*** %s ***\n", msg);
#else
throw msg;
#endif
}
void FailExpr(const char* expr)
{
char buffer [100];
sprintf(buffer, "Failed: A(%s)", expr);
Fail(buffer);
}
int StartTest(int mask_, const char* name_, const char* desc_)
{
if (mask_)
{
#if q4_MFC && defined(_DEBUG)
TRACE("%s - %-40s *** DISABLED ***\n", name_, desc_);
#endif
#if !q4_MWCW_PROFILER
fprintf(stderr, "%s - %-40s *** DISABLED ***\n", name_, desc_);
#endif
return false;
}
#if q4_MFC && defined(_DEBUG)
TRACE("%s - %s\n", name_, desc_);
#endif
#if !q4_MWCW_PROFILER
fprintf(stderr, "%s - %s\n", name_, desc_);
#endif
char buffer [50];
sprintf(buffer, "%s%s.txt", TESTDIR, name_);
#if _WIN32_WCE
fclose(stdout);
fopen(buffer, TEXTOUT);
#else
freopen(buffer, TEXTOUT, stdout);
#endif
printf(">>> %s\n", desc_);
return true;
}
void CatchMsg(const char* msg)
{
#if !q4_MWCW_PROFILER
fprintf(stderr, "\t%s\n", msg);
#endif
printf("*** %s ***\n", msg);
}
void CatchOther()
{
#if !q4_MWCW_PROFILER
fputs("\tException!\n", stderr);
#endif
printf("*** Exception ***\n");
}