/**
@file
@brief testing the mpe_validatecol macro (LIBDS rule)
@details The LIBDS rule must accept the Data Controller format-catalog
reference (LIBREF.CATALOGNAME-FC) and reject everything else - including
a value that merely *starts* with a valid libds and continues past the
dash, which a bare scan on the dash would let through.
SAS Macros
@li mpe_validatecol.sas
@li mp_assertdsobs.sas
@author 4GL Apps Ltd
@copyright 4GL Apps Ltd. This code may only be used within Data Controller
and may not be re-distributed or re-sold without the express permission of
4GL Apps Ltd.
**/
data work.check;
length val $64;
/* valid: a plain libds */
exp=1; val='WORK.CLASS'; output;
exp=1; val='DC.MPE_TABLES'; output;
exp=1; val='_A._B'; output;
/* valid: the format-catalog form, however the suffix is cased */
exp=1; val='DCTEST.DCFMTS-FC'; output;
exp=1; val='dctest.dcfmts-fc'; output;
exp=1; val='WORK.CLASS-FC'; output;
/* valid: padded values are trimmed before the check */
exp=1; val='WORK.CLASS '; output;
/* invalid: not a libds at all */
exp=0; val='WORK'; output;
exp=0; val='WORK.CLASS.NOPE'; output;
exp=0; val=''; output;
exp=0; val='-FC'; output;
exp=0; val='../secprobe'; output;
/* invalid: the dash suffix is not exactly -FC */
exp=0; val='WORK.CLASS-FCX'; output;
exp=0; val='WORK.CLASS-C'; output;
exp=0; val='WORK.CLASS-FC X'; output;
/* invalid: content smuggled past a valid libds prefix */
exp=0; val="WORK.CLASS-FC'"; output;
exp=0; val='WORK.CLASS-FC;proc sql;'; output;
exp=0; val='WORK.CLASS-FC) or 1=1'; output;
exp=0; val='WORK.CLASS-fc-'; output;
run;
data work.check;
set work.check;
is_libds=0;
%mpe_validatecol(val,LIBDS,is_libds)
got=is_libds;
if got ne exp then putlog 'ERR' 'OR: unexpected result for [' val +(-1) ']';
run;
data work.mismatch;
set work.check;
where got ne exp;
run;
%mp_assertdsobs(work.mismatch,
desc=%str(Every LIBDS value validated as expected (catalog form permitted, nothing smuggled past the dash)),
test=EQUALS 0,
outds=work.test_results
)
/* dump for offline inspection */
data _null_;
set work.check;
putlog 'TEST_RESULT_LINE: [' val +(-1) '] exp=' exp 'got=' got;
run;