From 01dcbed948898d4295357cfe854b3d5d88cbbae1 Mon Sep 17 00:00:00 2001 From: Ralph Lange Date: Wed, 30 Jul 2014 13:36:26 +0200 Subject: [PATCH] ioc/db/test: add test for recGblCheckDeadband() --- src/ioc/db/test/Makefile | 6 ++ src/ioc/db/test/epicsRunDbTests.c | 2 + src/ioc/db/test/recGblCheckDeadbandTest.c | 118 ++++++++++++++++++++++ 3 files changed, 126 insertions(+) create mode 100644 src/ioc/db/test/recGblCheckDeadbandTest.c diff --git a/src/ioc/db/test/Makefile b/src/ioc/db/test/Makefile index 84514ddbd..7032292b2 100644 --- a/src/ioc/db/test/Makefile +++ b/src/ioc/db/test/Makefile @@ -79,6 +79,12 @@ TESTS += arrShorthandTest TESTPROD_HOST += benchdbConvert benchdbConvert_SRCS += benchdbConvert.c +TESTPROD_HOST += recGblCheckDeadbandTest +recGblCheckDeadbandTest_SRCS += recGblCheckDeadbandTest.c +recGblCheckDeadbandTest_SRCS += dbTestIoc_registerRecordDeviceDriver.cpp +testHarness_SRCS += recGblCheckDeadbandTest.c +TESTS += recGblCheckDeadbandTest + # The testHarness runs all the test programs in a known working order. testHarness_SRCS += epicsRunDbTests.c diff --git a/src/ioc/db/test/epicsRunDbTests.c b/src/ioc/db/test/epicsRunDbTests.c index ed6fd3c2a..ae150b55a 100644 --- a/src/ioc/db/test/epicsRunDbTests.c +++ b/src/ioc/db/test/epicsRunDbTests.c @@ -25,6 +25,7 @@ int dbPutLinkTest(void); int testDbChannel(void); int chfPluginTest(void); int arrShorthandTest(void); +int recGblCheckDeadbandTest(void); void epicsRunDbTests(void) { @@ -38,6 +39,7 @@ void epicsRunDbTests(void) runTest(dbPutLinkTest); runTest(testDbChannel); runTest(arrShorthandTest); + runTest(recGblCheckDeadbandTest); runTest(chfPluginTest); dbmfFreeChunks(); diff --git a/src/ioc/db/test/recGblCheckDeadbandTest.c b/src/ioc/db/test/recGblCheckDeadbandTest.c new file mode 100644 index 000000000..2df4c26ee --- /dev/null +++ b/src/ioc/db/test/recGblCheckDeadbandTest.c @@ -0,0 +1,118 @@ +/*************************************************************************\ +* Copyright (c) 2014 ITER Organization. +* EPICS BASE is distributed subject to a Software License Agreement found +* in file LICENSE that is included with this distribution. +\*************************************************************************/ + +/* + * Author: Ralph Lange + */ + +#include + +#include "recGbl.h" +#include "epicsMath.h" +#include "epicsUnitTest.h" +#include "testMain.h" + +/* Test parameters */ + +#define NO_OF_DEADBANDS 3 +#define NO_OF_PATTERNS 19 + +void dbTestIoc_registerRecordDeviceDriver(struct dbBase *); + +/* Indices for deadband value, test number, val in sequence */ +static int idbnd, itest, iseq; + +/* Different deadbands to test with */ +static double t_Deadband[NO_OF_DEADBANDS] = { -1, 0, 1.5 }; +/* Value sequences for each of the 16 tests */ +static double t_SetValues[NO_OF_PATTERNS][2]; +/* Expected updates (1=yes) for each sequence of each test of each deadband */ +static int t_ExpectedUpdates[NO_OF_DEADBANDS][NO_OF_PATTERNS] = { + { /* deadband = -1 */ + 1, 1, 1, 1, + 1, 1, 1, + 1, 1, 1, 1, + 1, 1, 1, 1, + 1, 1, 1, 1, + }, + { /* deadband = 0 */ + 1, 1, 0, 0, + 1, 1, 1, + 1, 0, 1, 1, + 1, 1, 0, 1, + 1, 1, 1, 0, + }, + { /* deadband = 1.5 */ + 0, 1, 0, 0, + 1, 1, 1, + 1, 0, 1, 1, + 1, 1, 0, 1, + 1, 1, 1, 0, + }, +}; + +MAIN(recGblCheckDeadbandTest) +{ + unsigned mask; + double oldval, newval; + + /* Test patterns: + * 0: step less than deadband (of 1.5) + * 1: step larger than deadband (of 1.5) + * 2: no change + * 3: -0.0 -> +0.0 + * ... all possible combinations of steps + * between: finite / NaN / -inf / +inf + */ + t_SetValues[ 0][0] = 1.0; t_SetValues[ 0][1] = 2.0; + t_SetValues[ 1][0] = 0.0; t_SetValues[ 1][1] = 2.0; + t_SetValues[ 2][0] = 0.0; t_SetValues[ 2][1] = 0.0; + t_SetValues[ 3][0] = -0.0; t_SetValues[ 3][1] = 0.0; + t_SetValues[ 4][0] = 1.0; t_SetValues[ 4][1] = epicsNAN; + t_SetValues[ 5][0] = 1.0; t_SetValues[ 5][1] = epicsINF; + t_SetValues[ 6][0] = 1.0; t_SetValues[ 6][1] = -epicsINF; + t_SetValues[ 7][0] = epicsNAN; t_SetValues[ 7][1] = 1.0; + t_SetValues[ 8][0] = epicsNAN; t_SetValues[ 8][1] = epicsNAN; + t_SetValues[ 9][0] = epicsNAN; t_SetValues[ 9][1] = epicsINF; + t_SetValues[10][0] = epicsNAN; t_SetValues[10][1] = -epicsINF; + t_SetValues[11][0] = epicsINF; t_SetValues[11][1] = 1.0; + t_SetValues[12][0] = epicsINF; t_SetValues[12][1] = epicsNAN; + t_SetValues[13][0] = epicsINF; t_SetValues[13][1] = epicsINF; + t_SetValues[14][0] = epicsINF; t_SetValues[14][1] = -epicsINF; + t_SetValues[15][0] = -epicsINF; t_SetValues[15][1] = 1.0; + t_SetValues[16][0] = -epicsINF; t_SetValues[16][1] = epicsNAN; + t_SetValues[17][0] = -epicsINF; t_SetValues[17][1] = epicsINF; + t_SetValues[18][0] = -epicsINF; t_SetValues[18][1] = -epicsINF; + + testPlan(114); + + /* Loop over all tested deadband values */ + for (idbnd = 0; idbnd < NO_OF_DEADBANDS; idbnd++) { + + /* Loop over all test patterns */ + for (itest = 0; itest < NO_OF_PATTERNS; itest++) { + oldval = t_SetValues[itest][0]; + newval = t_SetValues[itest][1]; + mask = 0; + + recGblCheckDeadband(&oldval, newval, t_Deadband[idbnd], &mask, 1); + + /* Check expected vs. actual test result */ + testOk(t_ExpectedUpdates[idbnd][itest] == mask, + "deadband=%2.1f: check for oldvalue=%f newvalue=%f (expected %d, got %d)", + t_Deadband[idbnd], t_SetValues[itest][0], t_SetValues[itest][1], + t_ExpectedUpdates[idbnd][itest], mask); + + if (mask) { + testOk((oldval == newval) || (isnan(oldval) && isnan(newval)), "mask set, oldval equals newval"); + } else { + testOk((oldval == t_SetValues[itest][0]) || (isnan(oldval) && isnan(t_SetValues[itest][0])), + "mask not set, oldval unchanged"); + } + } + } + return testDone(); +}