Files
pcas/src/libCom/test/macLibTest.c
Andrew Johnson 37b371e956 macLib cleanup, added support for scoped macros.
New test program for regular macros as well as the environment variable tests.
2008-03-31 19:30:17 +00:00

198 lines
6.0 KiB
C

/*************************************************************************\
* Copyright (c) 2007 UChicago Argonne LLC, as Operator of Argonne
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
* $Id$
*/
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "macLib.h"
#include "dbDefs.h"
#include "envDefs.h"
#include "errlog.h"
#include "epicsUnitTest.h"
#include "testMain.h"
MAC_HANDLE *h;
static void check(const char *str, const char *expect)
{
char output[MAC_SIZE] = {'\0'};
long status = macExpandString(h, str, output, MAC_SIZE);
long expect_len = strlen(expect+1);
int expect_error = (expect[0] == '!');
int statBad = expect_error ^ (status < 0);
int strBad = strcmp(output, expect+1);
testOk(!statBad && !strBad, "%s => %s", str, output);
if (strBad) {
testDiag("Got \"%s\", expected \"%s\"", output, expect+1);
}
if (statBad) {
testDiag("Return status was %ld, expected %ld",
status, expect_error ? -expect_len : expect_len);
}
}
MAIN(macLibTest)
{
testPlan(81);
if (macCreateHandle(&h, NULL))
testAbort("macCreateHandle() failed");
macSuppressWarning(h, TRUE);
check("FOO", " FOO");
check("$(FOO)", "!$(FOO,undefined)");
check("${FOO}", "!$(FOO,undefined)");
check("${FOO=${FOO}}", "!$(FOO,undefined)");
check("${FOO,FOO}", "!$(FOO,undefined)");
check("${FOO,FOO=${FOO}}", "!$(FOO,recursive)");
check("${FOO,BAR}", "!$(FOO,undefined)");
check("${FOO,BAR=baz}", "!$(FOO,undefined)");
check("${FOO,BAR=${FOO}}", "!$(FOO,undefined)");
check("${FOO,BAR=baz,FUM}", "!$(FOO,undefined)");
check("${FOO=${BAR},BAR=${FOO}}", "!$(FOO,undefined)");
check("${FOO,FOO=${BAR},BAR=${FOO}}", "!$(BAR,recursive)");
check("${=}", " ");
check("x${=}y", " xy");
check("${,=}", " ");
check("x${,=}y", " xy");
check("${FOO=}", " ");
check("x${FOO=}y", " xy");
check("${FOO=,}", " ");
check("x${FOO=,}y", " xy");
check("${FOO,FOO=}", " ");
check("x${FOO,FOO=}y", " xy");
check("${FOO=,BAR}", " ");
check("x${FOO=,BAR}y", " xy");
check("${FOO=${BAR=}}", " ");
check("x${FOO=${BAR=}}y", " xy");
check("${FOO=,BAR=baz}", " ");
check("x${FOO=,BAR=baz}y", " xy");
check("${FOO=${BAR},BAR=}", " ");
check("x${FOO=${BAR},BAR=}y", " xy");
check("${=BAR}", " BAR");
check("x${=BAR}y", " xBARy");
check("${FOO=BAR}", " BAR");
check("x${FOO=BAR}y", " xBARy");
macPutValue(h, "FOO", "BLETCH");
/* FOO = "BLETCH" */
check("${FOO}", " BLETCH");
check("${FOO,FOO}", " BLETCH");
check("x${FOO}y", " xBLETCHy");
check("x${FOO}y${FOO}z", " xBLETCHyBLETCHz");
check("${FOO=BAR}", " BLETCH");
check("x${FOO=BAR}y", " xBLETCHy");
check("${FOO=${BAZ}}", " BLETCH");
check("${FOO=${BAZ},BAR=${BAZ}}", " BLETCH");
check("x${FOO=${BAZ}}y", " xBLETCHy");
check("x${FOO=${BAZ},BAR=${BAZ}}y", " xBLETCHy");
check("${BAR=${FOO}}", " BLETCH");
check("x${BAR=${FOO}}y", " xBLETCHy");
check("w${BAR=x${FOO}y}z", " wxBLETCHyz");
check("${FOO,FOO=BAR}", " BAR");
check("x${FOO,FOO=BAR}y", " xBARy");
check("${BAR,BAR=${FOO}}", " BLETCH");
check("x${BAR,BAR=${FOO}}y", " xBLETCHy");
check("${BAR,BAR=${${FOO}},BLETCH=GRIBBLE}", " GRIBBLE");
check("x${BAR,BAR=${${FOO}},BLETCH=GRIBBLE}y", " xGRIBBLEy");
check("${${BAR,BAR=${FOO}},BLETCH=GRIBBLE}", " GRIBBLE");
check("x${${BAR,BAR=${FOO}},BLETCH=GRIBBLE}y", " xGRIBBLEy");
check("${N=${FOO}/${BAR},BAR=GLEEP}", " BLETCH/GLEEP");
macPutValue(h, "BAR","GLEEP");
/* FOO = "BLETCH" */
/* BAR = "GLEEP" */
check("${FOO}/${BAR}", " BLETCH/GLEEP");
check("x${FOO}/${BAR}y", " xBLETCH/GLEEPy");
check("${FOO,BAR}/${BAR}", " BLETCH/GLEEP");
check("${FOO,BAR=x}/${BAR}", " BLETCH/GLEEP");
check("${BAZ=BLETCH,BAR}/${BAR}", " BLETCH/GLEEP");
check("${BAZ=BLETCH,BAR=x}/${BAR}", " BLETCH/GLEEP");
check("${N=${FOO}/${BAR}}", " BLETCH/GLEEP");
macPutValue(h, "BLETCH","BAR");
/* FOO = "BLETCH" */
/* BLETCH = "BAR" */
check("${${FOO}}", " BAR");
check("x${${FOO}}y", " xBARy");
check("${${FOO}=GRIBBLE}", " BAR");
check("x${${FOO}=GRIBBLE}y", " xBARy");
macPutValue(h, "BLETCH","${BAR}");
/* FOO = "BLETCH" */
/* BLETCH = "${BAR}" */
/* BAR = "GLEEP" */
check("${${FOO}}", " GLEEP");
check("${BLETCH=${FOO}}", " GLEEP");
macPutValue(h, "FOO","${BAR}");
/* FOO = "${BAR}" */
/* BAR = "GLEEP" */
check("${FOO}", " GLEEP");
check("${FOO=BLETCH,BAR=BAZ}", " BAZ");
macPutValue(h, "BAR","${BAZ}");
/* FOO = "${BAR}" */
/* BAR = "${BAZ}" */
check("${FOO}", "!$(BAZ,undefined)");
macPutValue(h, "BAR","${BAZ=GRIBBLE}");
/* FOO = "${BAR}" */
/* BAR = "${BAZ=GRIBBLE}" */
check("${FOO}", " GRIBBLE");
check("${FOO,BAZ=GEEK}", " GEEK");
macPutValue(h, "BAR","${STR1}");
macPutValue(h, "STR1","VAL1");
macPutValue(h, "STR2","VAL2");
/* FOO = "${BAR}" */
/* BAR = "${STR1}" */
/* STR1 = "VAL1" */
/* STR2 = "VAL2" */
check("${FOO}", " VAL1");
macPutValue(h, "BAR","${STR2}");
/* FOO = "${BAR}" */
/* BAR = "${STR2}" */
/* STR1 = "VAL1" */
/* STR2 = "VAL2" */
check("${FOO}", " VAL2");
macPutValue(h, "BAR","${FOO}");
/* FOO = "${BAR}" */
/* BAR = "${FOO}" */
check("${FOO}", "!$(BAR,recursive)");
check("${FOO=GRIBBLE}", "!$(BAR,recursive)");
check("${FOO=GRIBBLE,BAR=${FOO}}", "!$(BAR,recursive)");
check("${FOO,FOO=${FOO}}", "!$(FOO,recursive)");
check("${FOO=GRIBBLE,FOO=${FOO}}", "!$(FOO,recursive)");
return testDone();
}