/* dyStringTest - tests for dyString */

#include "common.h"
#include "dystring.h"

static void usage()
/* Print usage message */
{
errAbort(
   "dyStringTest - check for dyString\n"
   "usage:\n"
   "   dyStringTest\n"
   "\n");
}
int errCount = 0;  /* count of errors */

static void dyStringCheck(char *id, struct dyString *ds, char *expect)
/* check if a dyString contains the expected value */
{
if (!sameString(ds->string, expect))
    {
    fprintf(stderr, "dyString test %s failed: expected \"%s\", got \"%s\"\n",
            id, expect, ds->string);
    errCount++;
    }
}

static char *mkString(int len)
/* create test string with repetative pattern */
{
static char *base = "abcdefghijklmnopABCDEFGHIJKLMNOP";
int baseLen = strlen(base);
int numRep = (len+2*baseLen)/baseLen; /* a little slop */
int i;
char *p, *str = needMem((numRep*baseLen)+1);

for (p = str, i = 0; i < numRep; i++, p += baseLen)
    strcpy(p, base);
str[len] = '\0';
return str;
}

static void printfLargeTest(char *id, int len)
/* test dyStringPrintf with a large string */
{
struct dyString *ds = dyStringNew(0);
char *str = mkString(len);

dyStringPrintf(ds, "%s", str);
if (ds->stringSize != len)
    {
    fprintf(stderr, "dyString test %s failed: expected length of %d, got %d\n",
            id, len, ds->stringSize);
    errCount++;
    }
else 
    dyStringCheck(id, ds, str);

freeMem(str);
dyStringFree(&ds);
}

static void printfTest()
/* test dyStringPrintf */
{
struct dyString *ds = dyStringNew(0);
int initBufSize = ds->bufSize;  /* size of new string buffer */

/* small string */
dyStringPrintf(ds, "%d %.2s %d", 10, "abcdefg", 20);
dyStringCheck("printfSmall", ds, "10 ab 20");
dyStringClear(ds);

/* large strings */
printfLargeTest("printfUnderBufSz", initBufSize-1);
printfLargeTest("printfAtBufSz", initBufSize);
printfLargeTest("printfOverBufSz", initBufSize+1);
#if 0 /* until x86_64 bug is fixed */
printfLargeTest("printf8000", 8000);
#endif

dyStringFree(&ds);
}

static void dyStringTest()
/* dyStringTest - tests for dyString */
{
printfTest();
if (errCount > 0)
    errAbort("%d tests failed", errCount);
}

int main(int argc, char *argv[])
{
if (argc != 1)
    usage();
dyStringTest();
return 0;
}


