mirror of
https://github.com/sasjs/core.git
synced 2026-01-13 03:20:06 +00:00
feat: creating new mx_ suite of macros!
also adding new mx_getcode macro
This commit is contained in:
39
tests/base/mcf_getfmttype.test.sas
Normal file
39
tests/base/mcf_getfmttype.test.sas
Normal file
@@ -0,0 +1,39 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mcf_getfmttype.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mcf_getfmttype.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertscope.sas
|
||||
|
||||
**/
|
||||
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%mcf_getfmttype(wrap=YES, insert_cmplib=YES)
|
||||
%mp_assertscope(COMPARE,ignorelist=SASJS_FUNCTIONS)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%sysfunc(mcf_getfmttype(DATE9.))=DATE),
|
||||
desc=Check DATE format
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%sysfunc(mcf_getfmttype($6))=CHAR),
|
||||
desc=Check CHAR format
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%sysfunc(mcf_getfmttype(8.))=NUM),
|
||||
desc=Check NUM format
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%sysfunc(mcf_getfmttype(E8601DT))=DATETIME),
|
||||
desc=Check DATETIME format
|
||||
)
|
||||
|
||||
/* test 2 - compile again test for warnings */
|
||||
%mcf_getfmttype(wrap=YES, insert_cmplib=YES)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Check syscc=0 after re-initialisation
|
||||
)
|
||||
46
tests/base/mcf_init.test.sas
Normal file
46
tests/base/mcf_init.test.sas
Normal file
@@ -0,0 +1,46 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mcf_init.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mcf_init.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%mcf_init(test)=0),
|
||||
desc=Check if new func returns 0
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=No errs on basic invocation
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%mcf_init(test)=1),
|
||||
desc=Check if second invocation returns 1
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=No errs on second invocation
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%mcf_init(test2)=0),
|
||||
desc=Check if new invocation returns 0
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%mcf_init(test2)=1),
|
||||
desc=Check if second new invocation returns 1
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%mcf_init(test)=1),
|
||||
desc=Check original returns 1
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%mcf_init(t)=1),
|
||||
desc=Check subset returns 1
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=No errs at end
|
||||
)
|
||||
67
tests/base/mcf_length.test.sas
Normal file
67
tests/base/mcf_length.test.sas
Normal file
@@ -0,0 +1,67 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mcf_length.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mcf_length.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
%mcf_length(wrap=YES, insert_cmplib=YES)
|
||||
|
||||
data test;
|
||||
call symputx('null',mcf_length(.));
|
||||
call symputx('special',mcf_length(._));
|
||||
call symputx('three',mcf_length(1));
|
||||
call symputx('four',mcf_length(10000000));
|
||||
call symputx('five',mcf_length(12345678));
|
||||
call symputx('six',mcf_length(1234567890));
|
||||
call symputx('seven',mcf_length(12345678901234));
|
||||
call symputx('eight',mcf_length(12345678901234567));
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%str(&null)=%str(0)),
|
||||
desc=Check if NULL returns 0
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%str(&special)=%str(3)),
|
||||
desc=Check if special missing ._ returns 3
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%str(&three)=%str(3)),
|
||||
desc=Check for length 3
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%str(&four)=%str(4)),
|
||||
desc=Check for length 4
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%str(&five)=%str(5)),
|
||||
desc=Check for length 5
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%str(&six)=%str(6)),
|
||||
desc=Check for length 6
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%str(&seven)=%str(7)),
|
||||
desc=Check for length 3
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%str(&eight)=%str(8)),
|
||||
desc=Check for length 8
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Check syscc=0 before re-initialisation
|
||||
)
|
||||
|
||||
/* test 2 - compile again test for warnings */
|
||||
%mcf_length(wrap=YES, insert_cmplib=YES)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Check syscc=0 after re-initialisation
|
||||
)
|
||||
52
tests/base/mcf_string2file.test.sas
Normal file
52
tests/base/mcf_string2file.test.sas
Normal file
@@ -0,0 +1,52 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mcf_string2file macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mcf_string2file.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
|
||||
%mcf_string2file(wrap=YES, insert_cmplib=YES)
|
||||
|
||||
data _null_;
|
||||
rc=mcf_string2file(
|
||||
"%sysfunc(pathname(work))/newfile.txt"
|
||||
, "line1"
|
||||
, "APPEND");
|
||||
rc=mcf_string2file(
|
||||
"%sysfunc(pathname(work))/newfile.txt"
|
||||
, "line2"
|
||||
, "APPEND");
|
||||
run;
|
||||
|
||||
data _null_;
|
||||
infile "%sysfunc(pathname(work))/newfile.txt";
|
||||
input;
|
||||
if _n_=2 then call symputx('val',_infile_);
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%str(&val)=%str(line2)),
|
||||
desc=Check if APPEND works
|
||||
)
|
||||
|
||||
data _null_;
|
||||
rc=mcf_string2file(
|
||||
"%sysfunc(pathname(work))/newfile.txt"
|
||||
, "creating"
|
||||
, "CREATE");
|
||||
run;
|
||||
|
||||
data _null_;
|
||||
infile "%sysfunc(pathname(work))/newfile.txt";
|
||||
input;
|
||||
if _n_=1 then call symputx('val2',_infile_);
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%str(&val2)=%str(creating)),
|
||||
desc=Check if CREATE works
|
||||
)
|
||||
23
tests/base/mf_dedup.test.sas
Normal file
23
tests/base/mf_dedup.test.sas
Normal file
@@ -0,0 +1,23 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mf_dedup macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_dedup.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
%let str=One two one two and through and through;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=("%mf_dedup(&str)"="One two one and through"),
|
||||
desc=Basic test,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=("%mf_dedup(&str,outdlm=%str(,))"="One,two,one,and,through"),
|
||||
desc=Outdlm test,
|
||||
outds=work.test_results
|
||||
)
|
||||
29
tests/base/mf_deletefile.test.sas
Normal file
29
tests/base/mf_deletefile.test.sas
Normal file
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mf_deletefile.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_deletefile.sas
|
||||
@li mf_writefile.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertscope.sas
|
||||
|
||||
**/
|
||||
|
||||
%let test1file=&sasjswork/myfile1.txt;
|
||||
|
||||
%mf_writefile(&test1file,l1=some content)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%sysfunc(fileexist(&test1file))=1),
|
||||
desc=Check &test1file exists
|
||||
)
|
||||
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%mf_deletefile(&test1file)
|
||||
%mp_assertscope(COMPARE)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%sysfunc(fileexist(&test1file))=0),
|
||||
desc=Check &test1file no longer exists
|
||||
)
|
||||
25
tests/base/mf_existds.test.sas
Normal file
25
tests/base/mf_existds.test.sas
Normal file
@@ -0,0 +1,25 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mf_existfileref macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_existds.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
data work.testme;
|
||||
x=1;
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%mf_existds(work.testme)=1),
|
||||
desc=Checking existing dataset exists,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%mf_existds(work.try2testme)=0),
|
||||
desc=Checking non existing dataset does not exist,
|
||||
outds=work.test_results
|
||||
)
|
||||
35
tests/base/mf_existfileref.test.sas
Normal file
35
tests/base/mf_existfileref.test.sas
Normal file
@@ -0,0 +1,35 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mf_existfileref macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_existfileref.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
filename ref1 temp;
|
||||
filename ref2 temp;
|
||||
|
||||
data _null_;
|
||||
file ref1;
|
||||
put 'exists';
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%mf_existfileref(ref1)=1),
|
||||
desc=Checking fileref WITH target file exists,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%mf_existfileref(ref2)=1),
|
||||
desc=Checking fileref WITHOUT target file exists,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%mf_existfileref(ref3)=0),
|
||||
desc=Checking non-existant fref does not exist,
|
||||
outds=work.test_results
|
||||
)
|
||||
22
tests/base/mf_existfunction.test.sas
Normal file
22
tests/base/mf_existfunction.test.sas
Normal file
@@ -0,0 +1,22 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mf_existfunction macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_existfunction.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%mf_existfunction(CAT)=1),
|
||||
desc=Checking if CAT function exists,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%mf_existfunction(DOG)=0),
|
||||
desc=Checking DOG function does not exist,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
20
tests/base/mf_existvar.test.sas
Normal file
20
tests/base/mf_existvar.test.sas
Normal file
@@ -0,0 +1,20 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mf_existvar macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_existvar.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%mf_existvar(sashelp.class,age)>0),
|
||||
desc=Checking existing var exists
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%mf_existvar(sashelp.class,isjustanumber)=0),
|
||||
desc=Checking non existing var does not exist
|
||||
)
|
||||
22
tests/base/mf_fmtdttm.test.sas
Normal file
22
tests/base/mf_fmtdttm.test.sas
Normal file
@@ -0,0 +1,22 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mf_fmtdttm macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_fmtdttm.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertscope.sas
|
||||
|
||||
**/
|
||||
|
||||
%global test1;
|
||||
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%let test1=%mf_fmtdttm();
|
||||
%mp_assertscope(COMPARE,ignorelist=test1)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=("&test1"="DATETIME19.3" or "&test1"="E8601DT26.6"),
|
||||
desc=Basic test,
|
||||
outds=work.test_results
|
||||
)
|
||||
65
tests/base/mf_getapploc.test.sas
Normal file
65
tests/base/mf_getapploc.test.sas
Normal file
@@ -0,0 +1,65 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mf_getapploc macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_getapploc.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"%mf_getapploc(/some/loc/tests/services/x/service)"="/some/loc"
|
||||
),
|
||||
desc=Checking test appLoc matches,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"%mf_getapploc(/some/loc/tests/services/tests/service)"="/some/loc"
|
||||
),
|
||||
desc=Checking nested services appLoc matches,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"%mf_getapploc(/some/area/services/admin/service)"="/some/area"
|
||||
),
|
||||
desc=Checking services appLoc matches,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"%mf_getapploc(/some/area/jobs/jobs/job)"="/some/area"
|
||||
),
|
||||
desc=Checking jobs appLoc matches,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"%mf_getapploc(/some/area/tests/macros/somemacro.sas)"="/some/area"
|
||||
),
|
||||
desc=Checking tests/macros appLoc matches (which has no subfolder),
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"%mf_getapploc(/some/area/tests/testsetup)"="/some/area"
|
||||
),
|
||||
desc=Checking tests/testsetup operation,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"%mf_getapploc(/some/area/tests/testteardown)"="/some/area"
|
||||
),
|
||||
desc=Checking tests/teardown operation,
|
||||
outds=work.test_results
|
||||
)
|
||||
30
tests/base/mf_getfilesize.test.sas
Normal file
30
tests/base/mf_getfilesize.test.sas
Normal file
@@ -0,0 +1,30 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mf_getfilesize macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_getfilesize.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertscope.sas
|
||||
|
||||
**/
|
||||
|
||||
data test;
|
||||
x=1;
|
||||
run;
|
||||
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%put %mf_getfilesize(libds=work.test)
|
||||
%mp_assertscope(COMPARE)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Checking syscc
|
||||
)
|
||||
|
||||
%put %mf_getfilesize(libds=test);
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Checking syscc with one level name
|
||||
)
|
||||
33
tests/base/mf_getfmtlist.test.sas
Normal file
33
tests/base/mf_getfmtlist.test.sas
Normal file
@@ -0,0 +1,33 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mf_getfmtlist macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_getfmtlist.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"%mf_getfmtlist(sashelp.prdsale)"="DOLLAR $CHAR W MONNAME"
|
||||
),
|
||||
desc=Checking basic numeric,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"%mf_getfmtlist(sashelp.shoes)"="$CHAR BEST DOLLAR"
|
||||
),
|
||||
desc=Checking basic char,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"%mf_getfmtlist(sashelp.demographics)"="BEST Z $CHAR COMMA PERCENTN"
|
||||
),
|
||||
desc=Checking longer numeric,
|
||||
outds=work.test_results
|
||||
)
|
||||
33
tests/base/mf_getfmtname.test.sas
Normal file
33
tests/base/mf_getfmtname.test.sas
Normal file
@@ -0,0 +1,33 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mf_getfmtname macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_getfmtname.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"%mf_getfmtname(8.)"="W"
|
||||
),
|
||||
desc=Checking basic numeric,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"%mf_getfmtname($4.)"="$CHAR"
|
||||
),
|
||||
desc=Checking basic char,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"%mf_getfmtname(comma14.10)"="COMMA"
|
||||
),
|
||||
desc=Checking longer numeric,
|
||||
outds=work.test_results
|
||||
)
|
||||
36
tests/base/mf_getuniquefileref.test.sas
Normal file
36
tests/base/mf_getuniquefileref.test.sas
Normal file
@@ -0,0 +1,36 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mf_getuniquefileref macro
|
||||
@details To test performance you can also use the following macro:
|
||||
|
||||
%macro x(prefix);
|
||||
%let now=%sysfunc(datetime());
|
||||
%do x=1 %to 1000;
|
||||
%let rc=%mf_getuniquefileref(prefix=&prefix);
|
||||
%end;
|
||||
%put %sysevalf(%sysfunc(datetime())-&now);
|
||||
%mend;
|
||||
%x(_)
|
||||
%x(0)
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_getuniquefileref.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"%substr(%mf_getuniquefileref(prefix=0),1,1)"="#"
|
||||
),
|
||||
desc=Checking for a natively assigned fileref,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"%substr(%mf_getuniquefileref(),1,1)"="_"
|
||||
),
|
||||
desc=Checking for a default fileref,
|
||||
outds=work.test_results
|
||||
)
|
||||
54
tests/base/mf_getuniquelibref.test.sas
Normal file
54
tests/base/mf_getuniquelibref.test.sas
Normal file
@@ -0,0 +1,54 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mf_getuniquelibref macro
|
||||
@details To test performance you can also use the following macro:
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_getuniquelibref.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertscope.sas
|
||||
|
||||
**/
|
||||
|
||||
/* check valid libs */
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%let libshort=%mf_getuniquelibref(prefix=lib);
|
||||
%mp_assertscope(COMPARE,ignorelist=LIBSHORT)
|
||||
libname &libshort (work);
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Checking for valid libref &libshort,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%let lib7=%mf_getuniquelibref(prefix=libref7);
|
||||
libname &lib7 (work);
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Checking for valid libref &lib7,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
|
||||
/* check for invalid libs */
|
||||
|
||||
%let lib8=%mf_getuniquelibref(prefix=lib8char);
|
||||
%mp_assert(
|
||||
iftrue=(&lib8=0),
|
||||
desc=Invalid prefix (8 chars),
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%let liblong=%mf_getuniquelibref(prefix=invalidlib);
|
||||
%mp_assert(
|
||||
iftrue=(&liblong=0),
|
||||
desc=Checking for invalid libref (long),
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%let badlib=%mf_getuniquelibref(prefix=8adlib);
|
||||
%mp_assert(
|
||||
iftrue=(&badlib=0),
|
||||
desc=Checking for invalid libref (8adlib),
|
||||
outds=work.test_results
|
||||
)
|
||||
46
tests/base/mf_getvarcount.test.sas
Normal file
46
tests/base/mf_getvarcount.test.sas
Normal file
@@ -0,0 +1,46 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mf_getvarlist macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_getvarcount.sas
|
||||
@li mp_assertscope.sas
|
||||
|
||||
**/
|
||||
|
||||
data work.all work.nums(keep=num1 num2) work.chars(keep=char1 char2);
|
||||
length num1 num2 8 char1 char2 char3 $4;
|
||||
call missing (of _all_);
|
||||
output;
|
||||
run;
|
||||
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%put scope check:%mf_getvarcount(work.all);
|
||||
%mp_assertscope(COMPARE)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%mf_getvarcount(work.all)=5),
|
||||
desc=%str(Checking for mixed vars),
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%mf_getvarcount(work.all,typefilter=C)=3),
|
||||
desc=%str(Checking for char in mixed vars),
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%mf_getvarcount(work.all,typefilter=N)=2),
|
||||
desc=%str(Checking for num in mixed vars),
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%mf_getvarcount(work.nums,typefilter=c)=0),
|
||||
desc=%str(Checking for char in num vars),
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%mf_getvarcount(work.chars,typefilter=N)=0),
|
||||
desc=%str(Checking for num in char vars),
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
60
tests/base/mf_getvarlist.test.sas
Normal file
60
tests/base/mf_getvarlist.test.sas
Normal file
@@ -0,0 +1,60 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mf_getvarlist macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_getvarlist.sas
|
||||
|
||||
**/
|
||||
|
||||
|
||||
%let test1=%mf_getvarlist(sashelp.class);
|
||||
%let test2=%mf_getvarlist(sashelp.class,dlm=X);
|
||||
%let test3=%mf_getvarlist(sashelp.class,dlm=%str(,),quote=double);
|
||||
%let test4=%mf_getvarlist(sashelp.class,typefilter=N);
|
||||
%let test5=%mf_getvarlist(sashelp.class,typefilter=C);
|
||||
|
||||
data work.test_results;
|
||||
length test_description $256 test_result $4 test_comments base result $256;
|
||||
test_description="Basic test";
|
||||
base=symget('test1');
|
||||
result='Name Sex Age Height Weight';
|
||||
if base=result then test_result='PASS';
|
||||
else test_result='FAIL';
|
||||
test_comments="Comparing "!!trim(base)!!' vs '!!trim(result);
|
||||
output;
|
||||
|
||||
test_description="DLM test";
|
||||
base=symget('test2');
|
||||
result='NameXSexXAgeXHeightXWeight';
|
||||
if base=result then test_result='PASS';
|
||||
else test_result='FAIL';
|
||||
test_comments="Comparing "!!trim(base)!!' vs '!!trim(result);
|
||||
output;
|
||||
|
||||
test_description="DLM + quote test";
|
||||
base=symget('test3');
|
||||
result='"Name","Sex","Age","Height","Weight"';
|
||||
if base=result then test_result='PASS';
|
||||
else test_result='FAIL';
|
||||
test_comments="Comparing "!!trim(base)!!' vs '!!trim(result);
|
||||
output;
|
||||
|
||||
test_description="Numeric Filter";
|
||||
base=symget('test4');
|
||||
result='Age Height Weight';
|
||||
if base=result then test_result='PASS';
|
||||
else test_result='FAIL';
|
||||
test_comments="Comparing "!!trim(base)!!' vs '!!trim(result);
|
||||
output;
|
||||
|
||||
test_description="Char Filter";
|
||||
base=symget('test5');
|
||||
result='Name Sex';
|
||||
if base=result then test_result='PASS';
|
||||
else test_result='FAIL';
|
||||
test_comments="Comparing "!!trim(base)!!' vs '!!trim(result);
|
||||
output;
|
||||
|
||||
drop base result;
|
||||
run;
|
||||
41
tests/base/mf_isint.test.sas
Normal file
41
tests/base/mf_isint.test.sas
Normal file
@@ -0,0 +1,41 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mf_isint macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_isint.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"%mf_isint(1)"="1"
|
||||
),
|
||||
desc=Checking basic mf_isint(1),
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"%mf_isint(1.1)"="0"
|
||||
),
|
||||
desc=Checking basic mf_isint(1.1),
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"%mf_isint(-1)"="1"
|
||||
),
|
||||
desc=Checking mf_isint(-1),
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"%mf_isint()"="0"
|
||||
),
|
||||
desc=Checking mf_isint(),
|
||||
outds=work.test_results
|
||||
)
|
||||
46
tests/base/mf_islibds.test.sas
Normal file
46
tests/base/mf_islibds.test.sas
Normal file
@@ -0,0 +1,46 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mf_islibds macro
|
||||
|
||||
%put %mf_islibds(work.something)=1;
|
||||
%put %mf_islibds(nolib)=0;
|
||||
%put %mf_islibds(badlibref.ds)=0;
|
||||
%put %mf_islibds(w.t.f)=0;
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_islibds.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
%mf_islibds(work.something)=1
|
||||
),
|
||||
desc=%str(Checking mf_islibds(work.something)=1),
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
%mf_islibds(nolib)=0
|
||||
),
|
||||
desc=%str(Checking mf_islibds(nolib)=0),
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
%mf_islibds(badlibref.ds)=0
|
||||
),
|
||||
desc=%str(Checking mf_islibds(badlibref.ds)=0),
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
%mf_islibds(w.t.f)=0
|
||||
),
|
||||
desc=%str(Checking mf_islibds(w.t.f)=0),
|
||||
outds=work.test_results
|
||||
)
|
||||
22
tests/base/mf_verifymacvars.test.sas
Normal file
22
tests/base/mf_verifymacvars.test.sas
Normal file
@@ -0,0 +1,22 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mf_verifymacvars macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_verifymacvars.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertscope.sas
|
||||
|
||||
**/
|
||||
|
||||
%let var1=x;
|
||||
%let var2=y;
|
||||
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%mp_assert(
|
||||
iftrue=(%mf_verifymacvars(var1 var2)=1),
|
||||
desc=Checking macvars exist,
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assertscope(COMPARE)
|
||||
|
||||
20
tests/base/mf_wordsinstr1andstr2.test.sas
Normal file
20
tests/base/mf_wordsinstr1andstr2.test.sas
Normal file
@@ -0,0 +1,20 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mf_wordsinstr1andstr2 macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_wordsinstr1andstr2.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
%let x=%mf_wordsinstr1andstr2(str1=xx DOLLAR x $CHAR xxx W MONNAME
|
||||
,str2=DOLLAR $CHAR W MONNAME xxxxxx
|
||||
);
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"&x"="DOLLAR $CHAR W MONNAME"
|
||||
),
|
||||
desc=Checking basic string,
|
||||
outds=work.test_results
|
||||
)
|
||||
20
tests/base/mf_wordsinstr1butnotstr2.test.sas
Normal file
20
tests/base/mf_wordsinstr1butnotstr2.test.sas
Normal file
@@ -0,0 +1,20 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mf_wordsinstr1butnotstr2 macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_wordsinstr1butnotstr2.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
%let x=%mf_wordsinstr1butnotstr2(str1=xx DOLLAR x $CHAR xxx W MONNAME
|
||||
,str2=ff xx x xxx xxxxxx
|
||||
);
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"&x"="DOLLAR $CHAR W MONNAME"
|
||||
),
|
||||
desc=Checking basic string,
|
||||
outds=work.test_results
|
||||
)
|
||||
74
tests/base/mf_writefile.test.sas
Normal file
74
tests/base/mf_writefile.test.sas
Normal file
@@ -0,0 +1,74 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mf_writefile.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_writefile.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
%mf_writefile(&sasjswork/myfile.txt,l1=some content,l2=more content)
|
||||
data _null_;
|
||||
infile "&sasjswork/myfile.txt";
|
||||
input;
|
||||
if _n_=2 then call symputx('test1',_infile_);
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Check code ran without errors,
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(&test1=more content),
|
||||
desc=Checking line was created,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mf_writefile(&sasjswork/myfile.txt,l1=some content,l2=different content)
|
||||
data _null_;
|
||||
infile "&sasjswork/myfile.txt";
|
||||
input;
|
||||
if _n_=2 then call symputx('test2',_infile_);
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Check code ran without errors for test2,
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(&test2=different content),
|
||||
desc=Checking second line was overwritten,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%global test3 test4;
|
||||
%mf_writefile(&sasjswork/myfile.txt
|
||||
,mode=a
|
||||
,l1=%str(aah, content)
|
||||
,l2=append content
|
||||
)
|
||||
data _null_;
|
||||
infile "&sasjswork/myfile.txt";
|
||||
input;
|
||||
if _n_=2 then call symputx('test3',_infile_);
|
||||
if _n_=4 then call symputx('test4',_infile_);
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Check code ran without errors for test2,
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(&test3=different content),
|
||||
desc=Checking second line was not overwritten,
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(&test4=append content),
|
||||
desc=Checking fourth line was appended,
|
||||
outds=work.test_results
|
||||
)
|
||||
36
tests/base/mp_abort.test.nofix.sas
Normal file
36
tests/base/mp_abort.test.nofix.sas
Normal file
@@ -0,0 +1,36 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_abort macro
|
||||
@details This is an unfixed problem with mp_abort when using the
|
||||
'unclosed macro' technique. This is only relevant for 9.4m3 environments,
|
||||
which can suffer from hung multibridge sessions from %abort and endsas.
|
||||
|
||||
The issue is that when called within a macro, within a %include, AND that
|
||||
macro contains subsequent logic, the service does not end cleanly - rather,
|
||||
we see:
|
||||
|
||||
ERROR: %EVAL function has no expression to evaluate, or %IF statement has no condition.
|
||||
ERROR: The macro TEST will stop executing.
|
||||
|
||||
We are not able to test this without a 9.4m3 environment, it is marked as
|
||||
nofix.
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_abort.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
%macro test();
|
||||
|
||||
filename blah temp;
|
||||
data _null_;
|
||||
file blah;
|
||||
put '%mp_abort();';
|
||||
run;
|
||||
%inc blah;
|
||||
|
||||
%if 1=1 %then %put Houston - we have a problem here;
|
||||
%mend test;
|
||||
|
||||
%test()
|
||||
41
tests/base/mp_appendfile.test.sas
Normal file
41
tests/base/mp_appendfile.test.sas
Normal file
@@ -0,0 +1,41 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_appendfile.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_appendfile.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
|
||||
filename tmp1 temp;
|
||||
filename tmp2 temp;
|
||||
filename tmp3 temp;
|
||||
data _null_; file tmp1; put 'base file';
|
||||
data _null_; file tmp2; put 'append1';
|
||||
data _null_; file tmp3; put 'append2';
|
||||
run;
|
||||
%mp_appendfile(baseref=tmp1, appendrefs=tmp2 tmp3)
|
||||
data _null_;
|
||||
infile tmp1;
|
||||
input;
|
||||
put _infile_;
|
||||
call symputx(cats('check',_n_),_infile_);
|
||||
run;
|
||||
%global check1 check2 check3;
|
||||
%mp_assert(
|
||||
iftrue=("&check1"="base file"),
|
||||
desc=Line 1 of file tmp1 is correct,
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=("&check2"="append1"),
|
||||
desc=Line 2 of file tmp1 is correct,
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=("&check3"="append2"),
|
||||
desc=Line 3 of file tmp1 is correct,
|
||||
outds=work.test_results
|
||||
)
|
||||
45
tests/base/mp_applyformats.test.sas
Normal file
45
tests/base/mp_applyformats.test.sas
Normal file
@@ -0,0 +1,45 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_applyformats.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_getvarformat.sas
|
||||
@li mp_applyformats.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_getcols.sas
|
||||
|
||||
**/
|
||||
|
||||
/**
|
||||
* Test 1 Base case
|
||||
*/
|
||||
|
||||
data work.example;
|
||||
set sashelp.prdsale;
|
||||
format _all_;
|
||||
run;
|
||||
%let origfmt=%mf_getvarformat(work.example,month);
|
||||
|
||||
%mp_getcols(sashelp.prdsale,outds=work.cols)
|
||||
|
||||
data work.cols2;
|
||||
set work.cols;
|
||||
lib='WORK';
|
||||
ds='EXAMPLE';
|
||||
var=name;
|
||||
fmt=format;
|
||||
keep lib ds var fmt;
|
||||
run;
|
||||
|
||||
%mp_applyformats(work.cols2)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=("&origfmt"=""),
|
||||
desc=Check that formats were cleared,
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=("%mf_getvarformat(work.example,month)"="MONNAME3."),
|
||||
desc=Check that formats were applied,
|
||||
outds=work.test_results
|
||||
)
|
||||
15
tests/base/mp_assert.test.sas
Normal file
15
tests/base/mp_assert.test.sas
Normal file
@@ -0,0 +1,15 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_assert macro
|
||||
@details This is quite "meta".. it's just testing itself
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(1=1),
|
||||
desc=Checking result was created,
|
||||
outds=work.test_results
|
||||
)
|
||||
32
tests/base/mp_assertcolvals.test.sas
Normal file
32
tests/base/mp_assertcolvals.test.sas
Normal file
@@ -0,0 +1,32 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_assertcolvals macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_assertcolvals.sas
|
||||
|
||||
**/
|
||||
|
||||
|
||||
data work.checkds;
|
||||
do checkval='Jane','James','Jill';
|
||||
output;
|
||||
end;
|
||||
run;
|
||||
%mp_assertcolvals(sashelp.class.name,
|
||||
checkvals=work.checkds.checkval,
|
||||
desc=At least one value has a match,
|
||||
test=ANYVAL
|
||||
)
|
||||
|
||||
data work.check;
|
||||
do val='M','F';
|
||||
output;
|
||||
end;
|
||||
run;
|
||||
%mp_assertcolvals(sashelp.class.sex,
|
||||
checkvals=work.check.val,
|
||||
desc=All values have a match,
|
||||
test=ALLVALS
|
||||
)
|
||||
|
||||
60
tests/base/mp_assertdsobs.test.sas
Normal file
60
tests/base/mp_assertdsobs.test.sas
Normal file
@@ -0,0 +1,60 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_assertdsobs.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_assertdsobs.sas
|
||||
@li mp_assertcolvals.sas
|
||||
|
||||
**/
|
||||
|
||||
|
||||
data work.somedata;
|
||||
do x=1 to 15;
|
||||
output;
|
||||
end;
|
||||
run;
|
||||
|
||||
%mp_assertdsobs(work.somedata,
|
||||
test=ATLEAST 15,
|
||||
outds=work.test_the_test
|
||||
)
|
||||
|
||||
%mp_assertdsobs(work.somedata,
|
||||
test=ATMOST 15,
|
||||
outds=work.test_the_test
|
||||
)
|
||||
|
||||
data work.check;
|
||||
val='PASS';
|
||||
run;
|
||||
%mp_assertcolvals(work.test_the_test.test_result,
|
||||
checkvals=work.check.val,
|
||||
desc=Testing ATLEAST / ATMOST for passes,
|
||||
test=ALLVALS
|
||||
)
|
||||
|
||||
%mp_assertdsobs(work.somedata,
|
||||
test=ATLEAST 16,
|
||||
outds=work.test_the_test2
|
||||
)
|
||||
%mp_assertdsobs(work.somedata,
|
||||
test=ATMOST 14,
|
||||
outds=work.test_the_test2
|
||||
)
|
||||
|
||||
data _null_;
|
||||
set work.test_the_test2;
|
||||
putlog (_all_)(=);
|
||||
run;
|
||||
|
||||
data work.check2;
|
||||
val='FAIL';
|
||||
run;
|
||||
%mp_assertcolvals(work.test_the_test2.test_result,
|
||||
checkvals=work.check2.val,
|
||||
desc=Testing ATLEAST / ATMOST for failures,
|
||||
test=ALLVALS
|
||||
)
|
||||
|
||||
|
||||
80
tests/base/mp_assertscope.test.sas
Normal file
80
tests/base/mp_assertscope.test.sas
Normal file
@@ -0,0 +1,80 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_assertscope macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_getvalue.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertscope.sas
|
||||
|
||||
|
||||
**/
|
||||
|
||||
%macro dostuff(action);
|
||||
%if &action=ADD %then %do;
|
||||
%global NEWVAR1 NEWVAR2;
|
||||
%end;
|
||||
%else %if &action=DEL %then %do;
|
||||
%symdel NEWVAR1 NEWVAR2;
|
||||
%end;
|
||||
%else %if &action=MOD %then %do;
|
||||
%let NEWVAR1=Let us pray..;
|
||||
%end;
|
||||
%else %if &action=NOTHING %then %do;
|
||||
%local a b c d e;
|
||||
%end;
|
||||
%mend dostuff;
|
||||
|
||||
|
||||
/* check for adding variables */
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%dostuff(ADD)
|
||||
%mp_assertscope(COMPARE,outds=work.testing_the_tester1)
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"%mf_getvalue(work.testing_the_tester1,test_comments)"
|
||||
="Mod:() Add:(NEWVAR1 NEWVAR2) Del:()"
|
||||
),
|
||||
desc=Checking result when vars added,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
|
||||
/* check for modifying variables */
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%dostuff(MOD)
|
||||
%mp_assertscope(COMPARE,outds=work.testing_the_tester2)
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"%mf_getvalue(work.testing_the_tester2,test_comments)"
|
||||
="Mod:(NEWVAR1) Add:() Del:()"
|
||||
),
|
||||
desc=Checking result when vars modified,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* check for deleting variables */
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%dostuff(DEL)
|
||||
%mp_assertscope(COMPARE,outds=work.testing_the_tester3)
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"%mf_getvalue(work.testing_the_tester3,test_comments)"
|
||||
="Mod:() Add:() Del:(NEWVAR1 NEWVAR2)"
|
||||
),
|
||||
desc=Checking result when vars deleted,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* check for doing nothing */
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%dostuff(NOTHING)
|
||||
%mp_assertscope(COMPARE,outds=work.testing_the_tester4)
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
"%mf_getvalue(work.testing_the_tester4,test_comments)"
|
||||
="GLOBAL Variables Unmodified"
|
||||
),
|
||||
desc=Checking results when nothing created,
|
||||
outds=work.test_results
|
||||
)
|
||||
67
tests/base/mp_base64copy.test.sas
Normal file
67
tests/base/mp_base64copy.test.sas
Normal file
@@ -0,0 +1,67 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_base64copy.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_base64copy.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
|
||||
/* TEST 1 - regular base64 decode */
|
||||
|
||||
%let string1=base ik ally;
|
||||
filename tmp temp;
|
||||
data _null_;
|
||||
file tmp;
|
||||
put "&string1";
|
||||
run;
|
||||
%mp_base64copy(inref=tmp, outref=myref, action=ENCODE)
|
||||
|
||||
data _null_;
|
||||
infile myref;
|
||||
input;
|
||||
put _infile_;
|
||||
run;
|
||||
%mp_base64copy(inref=myref, outref=mynewref, action=DECODE)
|
||||
data _null_;
|
||||
infile mynewref lrecl=5000;
|
||||
input;
|
||||
put _infile_;
|
||||
call symputx('string1_check',_infile_);
|
||||
stop;
|
||||
run;
|
||||
%mp_assert(
|
||||
iftrue=("&string1"="&string1_check"),
|
||||
desc=Basic String Compare,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
|
||||
/* multibyte string check */
|
||||
|
||||
filename tmp2 temp lrecl=500;
|
||||
data _null_;
|
||||
file tmp2;
|
||||
put "'╤', '╔', '╗', '═', '╧', '╚', '╝', '║', '╟', '─', '┼', '║', '╢', '│'";
|
||||
run;
|
||||
%mp_base64copy(inref=tmp2, outref=myref2, action=ENCODE)
|
||||
|
||||
%mp_base64copy(inref=myref2, outref=newref2, action=DECODE)
|
||||
data _null_;
|
||||
infile newref2 lrecl=5000;
|
||||
input;
|
||||
list;
|
||||
/* do not print the string to the log else viya 3.5 throws exception */
|
||||
if trim(_infile_)=
|
||||
"'╤', '╔', '╗', '═', '╧', '╚', '╝', '║', '╟', '─', '┼', '║', '╢', '│'"
|
||||
then call symputx('check2',1);
|
||||
else call symputx('check2',0);
|
||||
stop;
|
||||
run;
|
||||
%mp_assert(
|
||||
iftrue=("&check2"="1"),
|
||||
desc=Double Byte String Compare,
|
||||
outds=work.test_results
|
||||
)
|
||||
99
tests/base/mp_binarycopy.test.sas
Normal file
99
tests/base/mp_binarycopy.test.sas
Normal file
@@ -0,0 +1,99 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_binarycopy.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_binarycopy.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
|
||||
/* TEST 1 - regular file copy */
|
||||
%let string1=test1;
|
||||
filename tmp temp;
|
||||
filename myref temp;
|
||||
data _null_;
|
||||
file tmp;
|
||||
put "&string1";
|
||||
run;
|
||||
%mp_binarycopy(inref=tmp, outref=myref)
|
||||
data _null_;
|
||||
infile myref;
|
||||
input;
|
||||
put _infile_;
|
||||
call symputx('string1_check',_infile_);
|
||||
stop;
|
||||
run;
|
||||
%mp_assert(
|
||||
iftrue=("&string1"="&string1_check"),
|
||||
desc=Basic String Compare,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
|
||||
/* TEST 2 - File append */
|
||||
%let string2=test2;
|
||||
%let path2=%sysfunc(pathname(work))/somefile.txt;
|
||||
data _null_;
|
||||
file "&path2";
|
||||
put "&string2";
|
||||
run;
|
||||
%mp_binarycopy(inloc="&path2", outref=myref, mode=APPEND)
|
||||
data _null_;
|
||||
infile myref;
|
||||
input;
|
||||
put _infile_;
|
||||
if _n_=2 then call symputx('string2_check',_infile_);
|
||||
run;
|
||||
%mp_assert(
|
||||
iftrue=("&string2"="&string2_check"),
|
||||
desc=Append Check (file to ref),
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* TEST 3 - File create (ref to existing file) */
|
||||
%let string3=test3;
|
||||
%let path3=%sysfunc(pathname(work))/somefile3.txt;
|
||||
filename tmp3 temp;
|
||||
data _null_;
|
||||
file tmp3;
|
||||
put "&string3";
|
||||
run;
|
||||
data _null_;
|
||||
file "&path3";
|
||||
put "this should not be returned";
|
||||
run;
|
||||
%mp_binarycopy(inref=tmp3, outloc="&path3")
|
||||
data _null_;
|
||||
infile "&path3";
|
||||
input;
|
||||
put _infile_;
|
||||
if _n_=1 then call symputx('string3_check',_infile_);
|
||||
run;
|
||||
%mp_assert(
|
||||
iftrue=("&string3"="&string3_check"),
|
||||
desc=Append Check (ref to existing file),
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* TEST 4 - File append (ref to file) */
|
||||
%let string4=test4;
|
||||
%let string4_check=;
|
||||
filename tmp4 temp;
|
||||
data _null_;
|
||||
file tmp4;
|
||||
put "&string4";
|
||||
run;
|
||||
%mp_binarycopy(inref=tmp4, outloc="&path3",mode=APPEND)
|
||||
data _null_;
|
||||
infile "&path3";
|
||||
input;
|
||||
put _infile_;
|
||||
if _n_=2 then call symputx('string4_check',_infile_);
|
||||
run;
|
||||
%mp_assert(
|
||||
iftrue=("&string4"="&string4_check"),
|
||||
desc=Append Check (ref to file),
|
||||
outds=work.test_results
|
||||
)
|
||||
70
tests/base/mp_chop.test.sas
Normal file
70
tests/base/mp_chop.test.sas
Normal file
@@ -0,0 +1,70 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_chop.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_chop.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertscope.sas
|
||||
|
||||
**/
|
||||
|
||||
/* prep input string */
|
||||
%let src="%sysfunc(pathname(work))/file.txt";
|
||||
%let str=Chop here!;
|
||||
%let out1="%sysfunc(pathname(work))/file1.txt";
|
||||
%let out2="%sysfunc(pathname(work))/file2.txt";
|
||||
%let out3="%sysfunc(pathname(work))/file3.txt";
|
||||
%let out4="%sysfunc(pathname(work))/file4.txt";
|
||||
|
||||
data _null_;
|
||||
file &src;
|
||||
put "startsection&str.endsection";
|
||||
run;
|
||||
|
||||
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%mp_chop(&src, matchvar=str, keep=FIRST, outfile=&out1)
|
||||
%mp_chop(&src, matchvar=str, keep=LAST, outfile=&out2)
|
||||
%mp_chop(&src, matchvar=str, keep=FIRST, matchpoint=END, outfile=&out3)
|
||||
%mp_chop(&src, matchvar=str, keep=LAST, matchpoint=END, outfile=&out4)
|
||||
%mp_assertscope(COMPARE)
|
||||
|
||||
data _null_;
|
||||
infile &out1 lrecl=200;
|
||||
input;
|
||||
call symputx('test1',_infile_);
|
||||
data _null_;
|
||||
infile &out2 lrecl=200;
|
||||
input;
|
||||
call symputx('test2',_infile_);
|
||||
data _null_;
|
||||
infile &out3 lrecl=200;
|
||||
input;
|
||||
call symputx('test3',_infile_);
|
||||
data _null_;
|
||||
infile &out4 lrecl=200;
|
||||
input;
|
||||
call symputx('test4',_infile_);
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=("&test1" = "startsection"),
|
||||
desc=Checking keep FIRST matchpoint START
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=("&test2" = "Chop here!endsection"),
|
||||
desc=Checking keep LAST matchpoint START
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=("&test3" = "startsectionChop here!"),
|
||||
desc=Checking keep FIRST matchpoint END
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=("&test4" = "endsection"),
|
||||
desc=Checking keep LAST matchpoint END
|
||||
outds=work.test_results
|
||||
)
|
||||
39
tests/base/mp_cntlout.test.sas
Normal file
39
tests/base/mp_cntlout.test.sas
Normal file
@@ -0,0 +1,39 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_cntlout.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_nobs.sas
|
||||
@li mp_cntlout.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertscope.sas
|
||||
|
||||
**/
|
||||
|
||||
libname perm (work);
|
||||
data work.loadfmts;
|
||||
length fmtname $32;
|
||||
eexcl='Y';
|
||||
type='N';
|
||||
do i=1 to 100;
|
||||
fmtname=cats('SASJS_',i,'X');
|
||||
do j=1 to 100;
|
||||
start=cats(j);
|
||||
end=cats(j+1);
|
||||
label= cats('Dummy ',start);
|
||||
output;
|
||||
end;
|
||||
end;
|
||||
run;
|
||||
proc format cntlin=work.loadfmts library=perm.testcat;
|
||||
run;
|
||||
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%mp_cntlout(libcat=perm.testcat,cntlout=work.cntlout)
|
||||
%mp_assertscope(COMPARE)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%mf_nobs(work.cntlout)=10000),
|
||||
desc=Checking first hash diff,
|
||||
outds=work.test_results
|
||||
)
|
||||
52
tests/base/mp_copyfolder.test.sas
Normal file
52
tests/base/mp_copyfolder.test.sas
Normal file
@@ -0,0 +1,52 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_copyfolder.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_copyfolder.sas
|
||||
@li mf_mkdir.sas
|
||||
@li mf_nobs.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_dirlist.sas
|
||||
|
||||
**/
|
||||
|
||||
/**
|
||||
* make a directory structure
|
||||
*/
|
||||
|
||||
%let root=%sysfunc(pathname(work))/top;
|
||||
%mf_mkdir(&root)
|
||||
%mf_mkdir(&root/a)
|
||||
%mf_mkdir(&root/b)
|
||||
%mf_mkdir(&root/a/d)
|
||||
%mf_mkdir(&root/a/e)
|
||||
%mf_mkdir(&root/a/e/f)
|
||||
data "&root/a/e/f/ds1.sas7bdat";x=1;
|
||||
data "&root/a/e/ds2.sas7bdat";x=1;
|
||||
data "&root/a/ds3.sas7bdat";x=1;
|
||||
run;
|
||||
|
||||
%mp_dirlist(path=&root, outds=myTable, maxdepth=MAX)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%mf_nobs(work.mytable)=8),
|
||||
desc=Temp data successfully created,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/**
|
||||
* copy it
|
||||
*/
|
||||
%let newfolder=%sysfunc(pathname(work))/new;
|
||||
%mp_copyfolder(&root,&newfolder)
|
||||
|
||||
%mp_dirlist(path=&newfolder, outds=work.myTable2, maxdepth=MAX)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%mf_nobs(work.mytable2)=8),
|
||||
desc=Folder successfully copied,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
|
||||
31
tests/base/mp_coretable.test.sas
Normal file
31
tests/base/mp_coretable.test.sas
Normal file
@@ -0,0 +1,31 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_coretable.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_existds.sas
|
||||
@li mp_coretable.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
|
||||
%mp_coretable(LOCKTABLE,libds=work.lock)
|
||||
%mp_assert(
|
||||
iftrue=(%mf_existds(work.lock)=1),
|
||||
desc=Lock table created,
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_coretable(LOCKTABLE)
|
||||
%mp_assert(
|
||||
iftrue=("&syscc"="0"),
|
||||
desc=DDL export ran without errors,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_coretable(FILTER_SUMMARY,libds=work.sum)
|
||||
%mp_assert(
|
||||
iftrue=(%mf_existds(work.sum)=1),
|
||||
desc=Filter summary table created,
|
||||
outds=work.test_results
|
||||
)
|
||||
28
tests/base/mp_createwebservice.test.sas
Normal file
28
tests/base/mp_createwebservice.test.sas
Normal file
@@ -0,0 +1,28 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing ms_createwebservice.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_getuniquefileref.sas
|
||||
@li mp_assertscope.sas
|
||||
@li mp_createwebservice.sas
|
||||
|
||||
**/
|
||||
|
||||
%let path=&mcTestAppLoc/mp_createwebservice;
|
||||
%let name=myservice;
|
||||
%let fref=%mf_getuniquefileref();
|
||||
|
||||
data _null_;
|
||||
file &fref lrecl=3000;
|
||||
put '%put hello world;';
|
||||
run;
|
||||
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%mp_createwebservice(path=&path,name=&name,code=&fref,mdebug=&sasjs_mdebug)
|
||||
%mp_assertscope(COMPARE)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
50
tests/base/mp_deletefolder.test.sas
Normal file
50
tests/base/mp_deletefolder.test.sas
Normal file
@@ -0,0 +1,50 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_deletefolder.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_deletefolder.sas
|
||||
@li mf_mkdir.sas
|
||||
@li mf_nobs.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_dirlist.sas
|
||||
|
||||
**/
|
||||
|
||||
/**
|
||||
* make a directory structure
|
||||
*/
|
||||
|
||||
%let root=%sysfunc(pathname(work))/top;
|
||||
%mf_mkdir(&root)
|
||||
%mf_mkdir(&root/a)
|
||||
%mf_mkdir(&root/b)
|
||||
%mf_mkdir(&root/a/d)
|
||||
%mf_mkdir(&root/a/e)
|
||||
%mf_mkdir(&root/a/e/f)
|
||||
data "&root/a/e/f/ds1.sas7bdat";
|
||||
x=1;
|
||||
run;
|
||||
|
||||
%mp_dirlist(path=&root, outds=myTable, maxdepth=MAX)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%mf_nobs(work.mytable)=6),
|
||||
desc=Temp data successfully created,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_deletefolder(&root/a)
|
||||
|
||||
%mp_dirlist(path=&root, outds=work.myTable2, maxdepth=MAX)
|
||||
|
||||
data _null_;
|
||||
set work.mytable2;
|
||||
putlog (_all_)(=);
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%mf_nobs(work.mytable2)=1),
|
||||
desc=Subfolder and contents successfully deleted,
|
||||
outds=work.test_results
|
||||
)
|
||||
65
tests/base/mp_dirlist.test.sas
Normal file
65
tests/base/mp_dirlist.test.sas
Normal file
@@ -0,0 +1,65 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_dirlist.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_nobs.sas
|
||||
@li mf_mkdir.sas
|
||||
@li mp_dirlist.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
/**
|
||||
* make a directory structure
|
||||
*/
|
||||
|
||||
%let root=%sysfunc(pathname(work))/top;
|
||||
%mf_mkdir(&root)
|
||||
%mf_mkdir(&root/a)
|
||||
%mf_mkdir(&root/b)
|
||||
%mf_mkdir(&root/a/d)
|
||||
%mf_mkdir(&root/a/e)
|
||||
%mf_mkdir(&root/a/e/f)
|
||||
libname test "&root/a/e/f";
|
||||
data test.ds1;
|
||||
x=1;
|
||||
run;
|
||||
|
||||
%mp_dirlist(path=&root, outds=myTable, maxdepth=MAX)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%mf_nobs(work.mytable)=6),
|
||||
desc=All levels returned,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_dirlist(path=&root, outds=myTable2, maxdepth=2)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%mf_nobs(work.mytable2)=5),
|
||||
desc=Top two levels returned,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_dirlist(path=&root, outds=work.myTable3, maxdepth=0)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%mf_nobs(work.mytable3)=2),
|
||||
desc=Top level returned,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_dirlist(path=&root/b, outds=work.myTable4)
|
||||
%mp_assert(
|
||||
iftrue=(%mf_nobs(work.mytable4)=0),
|
||||
desc=Empty table for empty directory,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_dirlist(path=&root/notexisting, outds=work.myTable5)
|
||||
%mp_assert(
|
||||
iftrue=(%mf_nobs(work.mytable5)=0),
|
||||
desc=Empty table for non-existing directory,
|
||||
outds=work.test_results
|
||||
)
|
||||
60
tests/base/mp_ds2cards.test.sas
Normal file
60
tests/base/mp_ds2cards.test.sas
Normal file
@@ -0,0 +1,60 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_ds2cards.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_ds2cards.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
/**
|
||||
* test 1 - rebuild an existing dataset
|
||||
* Cars is a great dataset - it contains leading spaces, and formatted numerics
|
||||
*/
|
||||
|
||||
%mp_ds2cards(base_ds=sashelp.cars
|
||||
, tgt_ds=work.test
|
||||
, cards_file= "%sysfunc(pathname(work))/cars.sas"
|
||||
, showlog=NO
|
||||
)
|
||||
%inc "%sysfunc(pathname(work))/cars.sas"/source2 lrecl=32767;
|
||||
|
||||
proc compare base=sashelp.cars compare=work.test;
|
||||
quit;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&sysinfo=1),
|
||||
desc=sashelp.cars is identical except for ds label,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/**
|
||||
* test 2 - binary data compare
|
||||
*/
|
||||
data work.binarybase;
|
||||
format bin $hex500. z $hex.;
|
||||
do x=1 to 250;
|
||||
z=byte(x);
|
||||
bin=trim(bin)!!z;
|
||||
output;
|
||||
end;
|
||||
run;
|
||||
|
||||
%mp_ds2cards(base_ds=work.binarybase
|
||||
, showlog=YES
|
||||
, cards_file="%sysfunc(pathname(work))/c2.sas"
|
||||
, tgt_ds=work.binarycompare
|
||||
, append=
|
||||
)
|
||||
|
||||
%inc "%sysfunc(pathname(work))/c2.sas"/source2 lrecl=32767;
|
||||
|
||||
proc compare base=work.binarybase compare=work.binarycompare;
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&sysinfo=0),
|
||||
desc=work.binarybase dataset is identical,
|
||||
outds=work.test_results
|
||||
)
|
||||
166
tests/base/mp_ds2csv.test.sas
Normal file
166
tests/base/mp_ds2csv.test.sas
Normal file
@@ -0,0 +1,166 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_ds2csv.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_ds2csv.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertscope.sas
|
||||
|
||||
**/
|
||||
|
||||
data work.somedata;
|
||||
x=1;
|
||||
y=' t"w"o';
|
||||
z=.z;
|
||||
label x='x factor';
|
||||
run;
|
||||
|
||||
/**
|
||||
* Test 1 - default CSV
|
||||
*/
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%mp_ds2csv(work.somedata,outfile="&sasjswork/test1.csv")
|
||||
%mp_assertscope(COMPARE)
|
||||
|
||||
%let test1b=FAIL;
|
||||
data _null_;
|
||||
infile "&sasjswork/test1.csv";
|
||||
input;
|
||||
list;
|
||||
if _n_=1 then call symputx('test1a',_infile_);
|
||||
else if _infile_=:'1," t""w""o",.Z' then call symputx('test1b','PASS');
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=("&test1a"="x factor, Y, Z"),
|
||||
desc=Checking header row Test 1,
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=("&test1b"="PASS"),
|
||||
desc=Checking data row Test 1,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/**
|
||||
* Test 2 - NAME header with fileref and semicolons
|
||||
*/
|
||||
filename test2 "&sasjswork/test2.csv";
|
||||
%mp_ds2csv(work.somedata,outref=test2,dlm=SEMICOLON,headerformat=NAME)
|
||||
|
||||
%let test2b=FAIL;
|
||||
data _null_;
|
||||
infile test2;
|
||||
input;
|
||||
list;
|
||||
if _n_=1 then call symputx('test2a',_infile_);
|
||||
else if _infile_=:'1;" t""w""o";.Z' then call symputx('test2b','PASS');
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=("&test2a"="X; Y; Z"),
|
||||
desc=Checking header row Test 2,
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=("&test2b"="PASS"),
|
||||
desc=Checking data row Test 2,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/**
|
||||
* Test 3 - SASjs format
|
||||
*/
|
||||
filename test3 "&sasjswork/test3.csv";
|
||||
%mp_ds2csv(work.somedata,outref=test3,headerformat=SASJS)
|
||||
|
||||
%let test3b=FAIL;
|
||||
data _null_;
|
||||
infile test3;
|
||||
input;
|
||||
list;
|
||||
if _n_=1 then call symputx('test3a',_infile_);
|
||||
else if _infile_=:'1," t""w""o",.Z' then call symputx('test3b','PASS');
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=("&test3a"="X:best. Y:$char7. Z:best."),
|
||||
desc=Checking header row Test 3,
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=("&test3b"="PASS"),
|
||||
desc=Checking data row Test 3,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* test 4 - sasjs with compare */
|
||||
filename example temp;
|
||||
%mp_ds2csv(sashelp.air,outref=example,headerformat=SASJS)
|
||||
data _null_; infile example; input;put _infile_; if _n_>5 then stop;run;
|
||||
|
||||
data _null_;
|
||||
infile example;
|
||||
input;
|
||||
call symputx('stmnt',_infile_);
|
||||
stop;
|
||||
run;
|
||||
data work.want;
|
||||
infile example dsd firstobs=2;
|
||||
input &stmnt;
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&syscc =0),
|
||||
desc=Checking syscc prior to compare of sashelp.air,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
proc compare base=want compare=sashelp.air;
|
||||
run;
|
||||
%mp_assert(
|
||||
iftrue=(&sysinfo le 41),
|
||||
desc=Checking compare of sashelp.air,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* test 5 - sasjs with time/datetime/date */
|
||||
filename f2 temp;
|
||||
data work.test5;
|
||||
do x=1 to 5;
|
||||
y=x;
|
||||
z=x;
|
||||
end;
|
||||
format x date9. y datetime19. z time.;
|
||||
run;
|
||||
%mp_ds2csv(work.test5,outref=f2,headerformat=SASJS)
|
||||
data _null_; infile example; input;put _infile_; if _n_>5 then stop;run;
|
||||
|
||||
data _null_;
|
||||
infile f2;
|
||||
input;
|
||||
putlog _infile_;
|
||||
call symputx('stmnt2',_infile_);
|
||||
stop;
|
||||
run;
|
||||
data work.want5;
|
||||
infile f2 dsd firstobs=2;
|
||||
input &stmnt2;
|
||||
putlog _infile_;
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Checking syscc prior to compare of test5,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
proc compare base=want5 compare=work.test5;
|
||||
run;
|
||||
%mp_assert(
|
||||
iftrue=(&sysinfo le 41),
|
||||
desc=Checking compare of work.test5,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
30
tests/base/mp_ds2fmtds.test.sas
Normal file
30
tests/base/mp_ds2fmtds.test.sas
Normal file
@@ -0,0 +1,30 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_ds2fmtds.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_ds2fmtds.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
proc sql;
|
||||
create table test as select * from dictionary.tables where libname='SASHELP';
|
||||
|
||||
filename inc temp;
|
||||
data _null_;
|
||||
set work.test;
|
||||
file inc;
|
||||
libds=cats('sashelp.',memname);
|
||||
if exist(libds) then line=cats('%mp_ds2fmtds(',libds,',',memname,')');
|
||||
put line;
|
||||
run;
|
||||
|
||||
options obs=50;
|
||||
%inc inc;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Checking tables were created successfully,
|
||||
outds=work.test_results
|
||||
)
|
||||
31
tests/base/mp_ds2inserts.test.sas
Normal file
31
tests/base/mp_ds2inserts.test.sas
Normal file
@@ -0,0 +1,31 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_ds2inserts.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_ds2inserts.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
/**
|
||||
* test 1 - rebuild an existing dataset
|
||||
* Cars is a great dataset - it contains leading spaces, and formatted numerics
|
||||
*/
|
||||
|
||||
%mp_ds2inserts(sashelp.cars,outref=testref,schema=work,outds=test)
|
||||
|
||||
data work.test;
|
||||
set sashelp.cars;
|
||||
stop;
|
||||
proc sql;
|
||||
%inc testref;
|
||||
|
||||
proc compare base=sashelp.cars compare=work.test;
|
||||
quit;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&sysinfo=1),
|
||||
desc=sashelp.cars is identical except for ds label,
|
||||
outds=work.test_results
|
||||
)
|
||||
34
tests/base/mp_ds2md.test.sas
Normal file
34
tests/base/mp_ds2md.test.sas
Normal file
@@ -0,0 +1,34 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_ds2md.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_ds2md.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
%mp_ds2md(sashelp.class,outref=md)
|
||||
|
||||
data _null_;
|
||||
infile md;
|
||||
input;
|
||||
call symputx(cats('test',_n_),_infile_);
|
||||
if _n_=4 then stop;
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=("&test1"="|NAME:$8.|SEX:$1.|AGE:best.|HEIGHT:best.|WEIGHT:best.|"),
|
||||
desc=Checking header row,
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=("&test2"="|---|---|---|---|---|"),
|
||||
desc=Checking divider row,
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=("&test3"="|`Alfred `|`M `|`14 `|`69 `|`112.5 `|"),
|
||||
desc=Checking data row,
|
||||
outds=work.test_results
|
||||
)
|
||||
44
tests/base/mp_ds2squeeze.test.sas
Normal file
44
tests/base/mp_ds2squeeze.test.sas
Normal file
@@ -0,0 +1,44 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_ds2squeeze.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_getvarlen.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertscope.sas
|
||||
@li mp_ds2squeeze.sas
|
||||
|
||||
**/
|
||||
|
||||
data big;
|
||||
length my big $32000;
|
||||
do i=1 to 1e4;
|
||||
my=repeat('oh my',100);
|
||||
big='dawg';
|
||||
special=._;
|
||||
missn=.;
|
||||
missc='';
|
||||
output;
|
||||
end;
|
||||
run;
|
||||
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%mp_ds2squeeze(work.big,outds=work.smaller)
|
||||
%mp_assertscope(COMPARE)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Checking syscc
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%mf_getvarlen(work.smaller,missn)=3),
|
||||
desc=Check missing numeric is 3
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%mf_getvarlen(work.smaller,special)=3),
|
||||
desc=Check missing special numeric is 3
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%mf_getvarlen(work.smaller,missc)=1),
|
||||
desc=Check missing char is 1
|
||||
)
|
||||
181
tests/base/mp_filtercheck.test.sas
Normal file
181
tests/base/mp_filtercheck.test.sas
Normal file
@@ -0,0 +1,181 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_filtercheck macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_filtercheck.sas
|
||||
@li mp_assertdsobs.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertscope.sas
|
||||
|
||||
**/
|
||||
|
||||
/* set up test data */
|
||||
data work.class ;
|
||||
length name $8 sex $1 age height weight 8;
|
||||
infile cards dsd;
|
||||
input Name:$char. Sex :$char. Age Height Weight;
|
||||
datalines4;
|
||||
Alfred,M,14,69,112.5
|
||||
Alice,F,13,56.5,84
|
||||
Barbara,F,13,65.3,98
|
||||
Carol,F,14,62.8,102.5
|
||||
Henry,M,14,63.5,102.5
|
||||
James,M,12,57.3,83
|
||||
Jane,F,12,59.8,84.5
|
||||
Janet,F,15,62.5,112.5
|
||||
Jeffrey,M,13,62.5,84
|
||||
John,M,12,59,99.5
|
||||
Joyce,F,11,51.3,50.5
|
||||
Judy,F,14,64.3,90
|
||||
Louise,F,12,56.3,77
|
||||
Mary,F,15,66.5,112
|
||||
Philip,M,16,72,150
|
||||
Robert,M,12,64.8,128
|
||||
Ronald,M,15,67,133
|
||||
Thomas,M,11,57.5,85
|
||||
William,M,15,66.5,112
|
||||
;;;;
|
||||
run;
|
||||
|
||||
/* valid filter conditions */
|
||||
data work.inds;
|
||||
infile datalines4 dsd;
|
||||
input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
|
||||
OPERATOR_NM:$10. RAW_VALUE:$4000.;
|
||||
datalines4;
|
||||
AND,AND,1,AGE,=,12
|
||||
AND,AND,1,SEX,<=,"'M'"
|
||||
AND,OR,2,Name,NOT IN,"('Jane','Alfred')"
|
||||
AND,OR,2,Weight,>=,77.7
|
||||
AND,OR,2,Weight,NE,77.7
|
||||
AND,AND,1,age,=,.A
|
||||
AND,AND,1,height,<,.B
|
||||
;;;;
|
||||
run;
|
||||
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%mp_filtercheck(work.inds,
|
||||
targetds=work.class,
|
||||
outds=work.badrecords,
|
||||
abort=NO
|
||||
)
|
||||
%mp_assertscope(COMPARE)
|
||||
|
||||
%let syscc=0;
|
||||
%mp_assertdsobs(work.badrecords,
|
||||
desc=Valid filter query,
|
||||
test=EMPTY,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* invalid column */
|
||||
data work.inds;
|
||||
infile datalines4 dsd;
|
||||
input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
|
||||
OPERATOR_NM:$10. RAW_VALUE:$4000.;
|
||||
datalines4;
|
||||
AND,AND,1,invalid,=,12
|
||||
AND,AND,1,SEX,<=,"'M'"
|
||||
AND,OR,2,Name,NOT IN,"('Jane','Alfred')"
|
||||
AND,OR,2,Weight,>=,7
|
||||
;;;;
|
||||
run;
|
||||
%mp_filtercheck(work.inds,
|
||||
targetds=work.class,
|
||||
outds=work.badrecords,
|
||||
abort=NO
|
||||
)
|
||||
%let syscc=0;
|
||||
%mp_assertdsobs(work.badrecords,
|
||||
desc=Invalid column name,
|
||||
test=HASOBS,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* invalid raw value */
|
||||
data work.inds;
|
||||
infile datalines4 dsd;
|
||||
input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
|
||||
OPERATOR_NM:$10. RAW_VALUE:$4000.;
|
||||
datalines4;
|
||||
AND,OR,2,Name,NOT IN,"(''''Jane','Alfred')"
|
||||
;;;;
|
||||
run;
|
||||
|
||||
%mp_filtercheck(work.inds,
|
||||
targetds=work.class,
|
||||
outds=work.badrecords,
|
||||
abort=NO
|
||||
)
|
||||
%let syscc=0;
|
||||
%mp_assertdsobs(work.badrecords,
|
||||
desc=Invalid raw value,
|
||||
test=HASOBS,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* Code injection - column name */
|
||||
data work.inds;
|
||||
infile datalines4 dsd;
|
||||
input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
|
||||
OPERATOR_NM:$10. RAW_VALUE:$4000.;
|
||||
datalines4;
|
||||
AND,AND,1,%abort,=,12
|
||||
AND,OR,2,Weight,>=,7
|
||||
;;;;
|
||||
run;
|
||||
|
||||
%mp_filtercheck(work.inds,
|
||||
targetds=work.class,
|
||||
outds=work.badrecords,
|
||||
abort=NO
|
||||
)
|
||||
%let syscc=0;
|
||||
%mp_assertdsobs(work.badrecords,
|
||||
desc=Code injection - column name,
|
||||
test=HASOBS,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* Code injection - raw values*/
|
||||
data work.inds;
|
||||
infile datalines4 dsd;
|
||||
input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
|
||||
OPERATOR_NM:$10. RAW_VALUE:$4000.;
|
||||
datalines4;
|
||||
AND,AND,1,age,=,;;%abort
|
||||
;;;;
|
||||
run;
|
||||
%mp_filtercheck(work.inds,
|
||||
targetds=work.class,
|
||||
outds=work.badrecords,
|
||||
abort=NO
|
||||
)
|
||||
%let syscc=0;
|
||||
%mp_assertdsobs(work.badrecords,
|
||||
desc=Code injection - raw value abort,
|
||||
test=HASOBS,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* Supply variables with incorrect types */
|
||||
data work.inds;
|
||||
infile datalines4 dsd;
|
||||
input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
|
||||
OPERATOR_NM:$10. RAW_VALUE:8;
|
||||
datalines4;
|
||||
AND,AND,1,age,=,0
|
||||
;;;;
|
||||
run;
|
||||
%let syscc=0;
|
||||
%mp_filtercheck(work.inds,
|
||||
targetds=work.class,
|
||||
outds=work.badrecords,
|
||||
abort=NO
|
||||
)
|
||||
%mp_assert(iftrue=(&syscc=42),
|
||||
desc=Throw error if RAW_VALUE is incorrect,
|
||||
outds=work.test_results
|
||||
)
|
||||
%let syscc=0;
|
||||
150
tests/base/mp_filtergenerate.test.sas
Normal file
150
tests/base/mp_filtergenerate.test.sas
Normal file
@@ -0,0 +1,150 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_filtergenerate macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_filtergenerate.sas
|
||||
@li mp_filtercheck.sas
|
||||
@li mp_assertdsobs.sas
|
||||
|
||||
**/
|
||||
|
||||
options source2;
|
||||
|
||||
/* set up test data */
|
||||
data work.class ;
|
||||
length name $8 sex $1 age height weight 8;
|
||||
infile cards dsd;
|
||||
input Name:$char. Sex :$char. Age Height Weight;
|
||||
datalines4;
|
||||
Alfred,M,14,69,112.5
|
||||
Alice,F,13,56.5,84
|
||||
Barbara,F,13,65.3,98
|
||||
Carol,F,14,62.8,102.5
|
||||
Henry,M,14,63.5,102.5
|
||||
James,M,12,57.3,83
|
||||
Jane,F,12,59.8,84.5
|
||||
Janet,F,15,62.5,112.5
|
||||
Jeffrey,M,13,62.5,84
|
||||
John,M,12,59,99.5
|
||||
Joyce,F,11,51.3,50.5
|
||||
Judy,F,14,64.3,90
|
||||
Louise,F,12,56.3,77
|
||||
Mary,F,15,66.5,112
|
||||
Philip,M,16,72,150
|
||||
Robert,M,12,64.8,128
|
||||
Ronald,M,15,67,133
|
||||
Thomas,M,11,57.5,85
|
||||
William,M,15,66.5,112
|
||||
;;;;
|
||||
run;
|
||||
|
||||
/* valid filter */
|
||||
data work.inds;
|
||||
infile datalines4 dsd;
|
||||
input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
|
||||
OPERATOR_NM:$10. RAW_VALUE:$4000.;
|
||||
datalines4;
|
||||
AND,AND,1,AGE,>,5
|
||||
AND,AND,1,SEX,NE,"'M'"
|
||||
AND,OR,2,Name,NOT IN,"('Jane','Janet')"
|
||||
AND,OR,2,Weight,>=,84.6
|
||||
;;;;
|
||||
run;
|
||||
%mp_filtercheck(work.inds,targetds=work.class)
|
||||
%mp_filtergenerate(work.inds,outref=myfilter)
|
||||
data work.test;
|
||||
set work.class;
|
||||
where %inc myfilter;;
|
||||
run;
|
||||
%mp_assertdsobs(work.test,
|
||||
desc=Valid filter,
|
||||
test=EQUALS 8,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* empty filter (return all records) */
|
||||
data work.inds;
|
||||
infile datalines4 dsd;
|
||||
input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
|
||||
OPERATOR_NM:$10. RAW_VALUE:$4000.;
|
||||
datalines4;
|
||||
;;;;
|
||||
run;
|
||||
%mp_filtercheck(work.inds,targetds=work.class)
|
||||
%mp_filtergenerate(work.inds,outref=myfilter)
|
||||
data work.test;
|
||||
set work.class;
|
||||
where %inc myfilter;;
|
||||
run;
|
||||
%mp_assertdsobs(work.test,
|
||||
desc=Empty filter (return all records) ,
|
||||
test=EQUALS 19,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* single line filter */
|
||||
data work.inds;
|
||||
infile datalines4 dsd;
|
||||
input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
|
||||
OPERATOR_NM:$10. RAW_VALUE:$4000.;
|
||||
datalines4;
|
||||
AND,OR,2,Name,IN,"('Jane','Janet')"
|
||||
;;;;
|
||||
run;
|
||||
%mp_filtercheck(work.inds,targetds=work.class)
|
||||
%mp_filtergenerate(work.inds,outref=myfilter)
|
||||
data work.test;
|
||||
set work.class;
|
||||
where %inc myfilter;;
|
||||
run;
|
||||
%mp_assertdsobs(work.test,
|
||||
desc=Single line filter ,
|
||||
test=EQUALS 2,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* single line 2 group filter */
|
||||
data work.inds;
|
||||
infile datalines4 dsd;
|
||||
input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
|
||||
OPERATOR_NM:$10. RAW_VALUE:$4000.;
|
||||
datalines4;
|
||||
OR,OR,2,Name,IN,"('Jane','Janet')"
|
||||
OR,OR,3,Name,IN,"('James')"
|
||||
;;;;
|
||||
run;
|
||||
%mp_filtercheck(work.inds,targetds=work.class)
|
||||
%mp_filtergenerate(work.inds,outref=myfilter)
|
||||
data work.test;
|
||||
set work.class;
|
||||
where %inc myfilter;;
|
||||
run;
|
||||
%mp_assertdsobs(work.test,
|
||||
desc=Single line 2 group filter ,
|
||||
test=EQUALS 3,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* filter with nothing returned */
|
||||
data work.inds;
|
||||
infile datalines4 dsd;
|
||||
input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
|
||||
OPERATOR_NM:$10. RAW_VALUE:$4000.;
|
||||
datalines4;
|
||||
AND,OR,2,Name,IN,"('Jane','Janet')"
|
||||
AND,OR,3,Name,IN,"('James')"
|
||||
;;;;
|
||||
run;
|
||||
%mp_filtercheck(work.inds,targetds=work.class)
|
||||
%mp_filtergenerate(work.inds,outref=myfilter)
|
||||
data work.test;
|
||||
set work.class;
|
||||
where %inc myfilter;;
|
||||
run;
|
||||
%mp_assertdsobs(work.test,
|
||||
desc=Filter with nothing returned,
|
||||
test=EQUALS 0,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
113
tests/base/mp_filterstore.test.1.sas
Normal file
113
tests/base/mp_filterstore.test.1.sas
Normal file
@@ -0,0 +1,113 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_filterstore macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_coretable.sas
|
||||
@li mp_filterstore.sas
|
||||
@li mp_assertdsobs.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
/* set up test data */
|
||||
data work.class ;
|
||||
length name $8 sex $1 age height weight 8;
|
||||
infile cards dsd;
|
||||
input Name:$char. Sex :$char. Age Height Weight;
|
||||
datalines4;
|
||||
Alfred,M,14,69,112.5
|
||||
Alice,F,13,56.5,84
|
||||
Barbara,F,13,65.3,98
|
||||
Carol,F,14,62.8,102.5
|
||||
Henry,M,14,63.5,102.5
|
||||
James,M,12,57.3,83
|
||||
Jane,F,12,59.8,84.5
|
||||
Janet,F,15,62.5,112.5
|
||||
Jeffrey,M,13,62.5,84
|
||||
John,M,12,59,99.5
|
||||
Joyce,F,11,51.3,50.5
|
||||
Judy,F,14,64.3,90
|
||||
Louise,F,12,56.3,77
|
||||
Mary,F,15,66.5,112
|
||||
Philip,M,16,72,150
|
||||
Robert,M,12,64.8,128
|
||||
Ronald,M,15,67,133
|
||||
Thomas,M,11,57.5,85
|
||||
William,M,15,66.5,112
|
||||
;;;;
|
||||
run;
|
||||
|
||||
libname permlib (work);
|
||||
|
||||
%mp_coretable(LOCKTABLE,libds=permlib.locktable)
|
||||
%mp_coretable(FILTER_SUMMARY,libds=permlib.filtsum)
|
||||
%mp_coretable(FILTER_DETAIL,libds=permlib.filtdet)
|
||||
%mp_coretable(MAXKEYTABLE,libds=permlib.maxkey)
|
||||
|
||||
/* valid filter */
|
||||
data work.inds;
|
||||
infile datalines4 dsd;
|
||||
input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
|
||||
OPERATOR_NM:$12. RAW_VALUE:$4000.;
|
||||
datalines4;
|
||||
AND,AND,1,AGE,=,12
|
||||
AND,AND,1,SEX,<=,"'M'"
|
||||
AND,OR,2,Name,NOT IN,"('Jane','Alfred')"
|
||||
AND,OR,2,Weight,>=,77.7
|
||||
AND,OR,2,Weight,NE,77.7
|
||||
;;;;
|
||||
run;
|
||||
|
||||
%mp_filterstore(libds=work.class,
|
||||
queryds=work.inds,
|
||||
filter_summary=permlib.filtsum,
|
||||
filter_detail=permlib.filtdet,
|
||||
lock_table=permlib.locktable,
|
||||
maxkeytable=permlib.maxkey,
|
||||
outresult=work.result,
|
||||
outquery=work.query,
|
||||
mdebug=1
|
||||
)
|
||||
%mp_assert(iftrue=(&syscc=0),
|
||||
desc=Ensure macro runs without errors,
|
||||
outds=work.test_results
|
||||
)
|
||||
/* ensure only one record created */
|
||||
%mp_assertdsobs(permlib.filtsum,
|
||||
desc=Initial query,
|
||||
test=ATMOST 1,
|
||||
outds=work.test_results
|
||||
)
|
||||
/* check RK is correct */
|
||||
proc sql noprint;
|
||||
select max(filter_rk) into: test1 from work.result;
|
||||
%mp_assert(iftrue=(&test1=1),
|
||||
desc=Ensure filter rk is correct,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* Test 2 - load same table again and ensure we get the same RK */
|
||||
%mp_filterstore(libds=work.class,
|
||||
queryds=work.inds,
|
||||
filter_summary=permlib.filtsum,
|
||||
filter_detail=permlib.filtdet,
|
||||
lock_table=permlib.locktable,
|
||||
maxkeytable=permlib.maxkey,
|
||||
outresult=work.result,
|
||||
outquery=work.query,
|
||||
mdebug=1
|
||||
)
|
||||
/* ensure only one record created */
|
||||
%mp_assertdsobs(permlib.filtsum,
|
||||
desc=Initial query - same obs,
|
||||
test=ATMOST 1,
|
||||
outds=work.test_results
|
||||
)
|
||||
/* check RK is correct */
|
||||
proc sql noprint;
|
||||
select max(filter_rk) into: test2 from work.result;
|
||||
%mp_assert(iftrue=(&test2=1),
|
||||
desc=Ensure filter rk is correct for second run,
|
||||
outds=work.test_results
|
||||
)
|
||||
112
tests/base/mp_filterstore.test.2.sas
Normal file
112
tests/base/mp_filterstore.test.2.sas
Normal file
@@ -0,0 +1,112 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_filterstore macro with a format catalog
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_assert.sas
|
||||
@li mp_assertdsobs.sas
|
||||
@li mp_assertscope.sas
|
||||
@li mp_coretable.sas
|
||||
@li mp_filterstore.sas
|
||||
|
||||
**/
|
||||
|
||||
libname permlib (work);
|
||||
|
||||
%mp_coretable(LOCKTABLE,libds=permlib.locktable)
|
||||
%mp_coretable(FILTER_SUMMARY,libds=permlib.filtsum)
|
||||
%mp_coretable(FILTER_DETAIL,libds=permlib.filtdet)
|
||||
%mp_coretable(MAXKEYTABLE,libds=permlib.maxkey)
|
||||
|
||||
/* valid filter */
|
||||
data work.inds;
|
||||
infile datalines4 dsd;
|
||||
input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
|
||||
OPERATOR_NM:$12. RAW_VALUE:$4000.;
|
||||
datalines4;
|
||||
AND,AND,1,Start,>,"'2'"
|
||||
AND,AND,1,Fmtname,=,"'MORDOR'"
|
||||
OR,OR,2,Label,IN,"('Dragon1','Dragon2')"
|
||||
OR,OR,2,End,=,"'6'"
|
||||
OR,OR,2,Start,GE,"'10'"
|
||||
;;;;
|
||||
run;
|
||||
|
||||
/* make some formats */
|
||||
PROC FORMAT library=permlib.testfmts;
|
||||
picture MyMSdt other='%0Y-%0m-%0dT%0H:%0M:%0S' (datatype=datetime);
|
||||
RUN;
|
||||
data work.fmts;
|
||||
length fmtname $32;
|
||||
do fmtname='SMAUG','MORDOR','GOLLUM';
|
||||
do start=1 to 10;
|
||||
label= cats('Dragon ',start);
|
||||
output;
|
||||
end;
|
||||
end;
|
||||
run;
|
||||
proc sort data=work.fmts nodupkey;
|
||||
by fmtname start;
|
||||
run;
|
||||
proc format cntlin=work.fmts library=permlib.testfmts;
|
||||
run;
|
||||
proc format library=permlib.testfmts;
|
||||
invalue indays (default=13) other=42;
|
||||
run;
|
||||
|
||||
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%mp_filterstore(libds=permlib.testfmts-fc,
|
||||
queryds=work.inds,
|
||||
filter_summary=permlib.filtsum,
|
||||
filter_detail=permlib.filtdet,
|
||||
lock_table=permlib.locktable,
|
||||
maxkeytable=permlib.maxkey,
|
||||
outresult=work.result,
|
||||
outquery=work.query,
|
||||
mdebug=1
|
||||
)
|
||||
%mp_assertscope(COMPARE)
|
||||
|
||||
%mp_assert(iftrue=(&syscc=0),
|
||||
desc=Ensure macro runs without errors,
|
||||
outds=work.test_results
|
||||
)
|
||||
/* ensure only one record created */
|
||||
%mp_assertdsobs(permlib.filtsum,
|
||||
desc=Initial query,
|
||||
test=ATMOST 1,
|
||||
outds=work.test_results
|
||||
)
|
||||
/* check RK is correct */
|
||||
proc sql noprint;
|
||||
select max(filter_rk) into: test1 from work.result;
|
||||
%mp_assert(iftrue=(&test1=1),
|
||||
desc=Ensure filter rk is correct,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* Test 2 - load same table again and ensure we get the same RK */
|
||||
%mp_filterstore(libds=permlib.testfmts-fc,
|
||||
queryds=work.inds,
|
||||
filter_summary=permlib.filtsum,
|
||||
filter_detail=permlib.filtdet,
|
||||
lock_table=permlib.locktable,
|
||||
maxkeytable=permlib.maxkey,
|
||||
outresult=work.result,
|
||||
outquery=work.query,
|
||||
mdebug=1
|
||||
)
|
||||
/* ensure only one record created */
|
||||
%mp_assertdsobs(permlib.filtsum,
|
||||
desc=Initial query - same obs,
|
||||
test=ATMOST 1,
|
||||
outds=work.test_results
|
||||
)
|
||||
/* check RK is correct */
|
||||
proc sql noprint;
|
||||
select max(filter_rk) into: test2 from work.result;
|
||||
%mp_assert(iftrue=(&test2=1),
|
||||
desc=Ensure filter rk is correct for second run,
|
||||
outds=work.test_results
|
||||
)
|
||||
133
tests/base/mp_filtervalidate.test.sas
Normal file
133
tests/base/mp_filtervalidate.test.sas
Normal file
@@ -0,0 +1,133 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_filtervalidate macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_filtergenerate.sas
|
||||
@li mp_filtervalidate.sas
|
||||
@li mp_assertdsobs.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertscope.sas
|
||||
|
||||
**/
|
||||
|
||||
data work.class ;
|
||||
length name $8 sex $1 age height weight 8;
|
||||
infile cards dsd;
|
||||
input Name:$char. Sex :$char. Age Height Weight;
|
||||
datalines4;
|
||||
Alfred,M,14,69,112.5
|
||||
Alice,F,13,56.5,84
|
||||
Barbara,F,13,65.3,98
|
||||
Carol,F,14,62.8,102.5
|
||||
Henry,M,14,63.5,102.5
|
||||
James,M,12,57.3,83
|
||||
Jane,F,12,59.8,84.5
|
||||
Janet,F,15,62.5,112.5
|
||||
Jeffrey,M,13,62.5,84
|
||||
John,M,12,59,99.5
|
||||
Joyce,F,11,51.3,50.5
|
||||
Judy,F,14,64.3,90
|
||||
Louise,F,12,56.3,77
|
||||
Mary,F,15,66.5,112
|
||||
Philip,M,16,72,150
|
||||
Robert,M,12,64.8,128
|
||||
Ronald,M,15,67,133
|
||||
Thomas,M,11,57.5,85
|
||||
William,M,15,66.5,112
|
||||
;;;;
|
||||
run;
|
||||
|
||||
/* valid filter */
|
||||
data work.inds;
|
||||
infile datalines4 dsd;
|
||||
input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
|
||||
OPERATOR_NM:$10. RAW_VALUE:$4000.;
|
||||
datalines4;
|
||||
AND,AND,1,AGE,>,5
|
||||
AND,AND,1,SEX,NE,"'M'"
|
||||
AND,OR,2,Name,NOT IN,"('Jane','Janet')"
|
||||
AND,OR,2,Weight,>=,84.6
|
||||
AND,AND,3,age,=,.a
|
||||
AND,AND,4,weight,NE,._
|
||||
;;;;
|
||||
run;
|
||||
%mp_filtergenerate(work.inds,outref=myfilter)
|
||||
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%mp_filtervalidate(myfilter,work.class,outds=work.results,abort=NO)
|
||||
%mp_assertscope(COMPARE)
|
||||
|
||||
%mp_assertdsobs(work.results,
|
||||
desc=Valid filter,
|
||||
test=EMPTY,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* empty filter (return all records) */
|
||||
data work.inds;
|
||||
infile datalines4 dsd;
|
||||
input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
|
||||
OPERATOR_NM:$10. RAW_VALUE:$4000.;
|
||||
datalines4;
|
||||
;;;;
|
||||
run;
|
||||
%mp_filtergenerate(work.inds,outref=myfilter)
|
||||
%mp_filtervalidate(myfilter,work.class,outds=work.results,abort=NO)
|
||||
%mp_assertdsobs(work.results,
|
||||
desc=Empty filter,
|
||||
test=EMPTY,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
|
||||
|
||||
/* invalid filter - char var, num val */
|
||||
data work.inds;
|
||||
infile datalines4 dsd;
|
||||
input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
|
||||
OPERATOR_NM:$10. RAW_VALUE:$4000.;
|
||||
datalines4;
|
||||
AND,AND,1,SEX,NE,2
|
||||
;;;;
|
||||
run;
|
||||
%mp_filtergenerate(work.inds,outref=myfilter)
|
||||
%mp_filtervalidate(myfilter,work.class,outds=work.results,abort=NO)
|
||||
%let syscc=0;
|
||||
%let test3=0;
|
||||
data _null_;
|
||||
set work.results;
|
||||
if REASON_CD=:'VALIDATION_ERROR' then call symputx('test3',1);
|
||||
putlog (_all_)(=);
|
||||
stop;
|
||||
run;
|
||||
%mp_assert(
|
||||
iftrue=(&test3=1),
|
||||
desc=Checking char var could not receive num val,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* invalid filter - num var, char val */
|
||||
data work.inds;
|
||||
infile datalines4 dsd;
|
||||
input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
|
||||
OPERATOR_NM:$10. RAW_VALUE:$4000.;
|
||||
datalines4;
|
||||
AND,AND,1,age,NE,"'M'"
|
||||
;;;;
|
||||
run;
|
||||
%mp_filtergenerate(work.inds,outref=myfilter)
|
||||
%mp_filtervalidate(myfilter,work.class,outds=work.results,abort=NO)
|
||||
%let syscc=0;
|
||||
%let test4=0;
|
||||
data _null_;
|
||||
set work.results;
|
||||
if REASON_CD=:'VALIDATION_ERROR' then call symputx('test4',1);
|
||||
putlog (_all_)(=);
|
||||
stop;
|
||||
run;
|
||||
%mp_assert(
|
||||
iftrue=(&test4=1),
|
||||
desc=Checking num var could not receive char val,
|
||||
outds=work.test_results
|
||||
)
|
||||
40
tests/base/mp_getcols.test.sas
Normal file
40
tests/base/mp_getcols.test.sas
Normal file
@@ -0,0 +1,40 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_getcols macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_getcols.sas
|
||||
@li mp_assertcols.sas
|
||||
@li mp_assertcolvals.sas
|
||||
@li mp_assertdsobs.sas
|
||||
|
||||
**/
|
||||
|
||||
|
||||
/* valid filter */
|
||||
%mp_getcols(sashelp.airline,outds=work.info)
|
||||
|
||||
|
||||
%mp_assertdsobs(work.info,
|
||||
desc=Has 3 records,
|
||||
test=EQUALS 3,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
data work.check;
|
||||
length val $10;
|
||||
do val='NUMERIC','DATE','CHARACTER';
|
||||
output;
|
||||
end;
|
||||
run;
|
||||
%mp_assertcolvals(work.info.ddtype,
|
||||
checkvals=work.check.val,
|
||||
desc=All values have a match,
|
||||
test=ALLVALS
|
||||
)
|
||||
|
||||
%mp_assertcols(work.info,
|
||||
cols=name type length varnum format label ddtype fmtname,
|
||||
test=ALL,
|
||||
desc=check all columns exist
|
||||
)
|
||||
57
tests/base/mp_getconstraints.test.sas
Normal file
57
tests/base/mp_getconstraints.test.sas
Normal file
@@ -0,0 +1,57 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_getconstraints.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_nobs.sas
|
||||
@li mp_getconstraints.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertscope.sas
|
||||
|
||||
**/
|
||||
|
||||
|
||||
%macro conditional();
|
||||
|
||||
%if %sysfunc(exist(sashelp.vcncolu,view))=1 %then %do;
|
||||
proc sql;
|
||||
create table work.example(
|
||||
TX_FROM float format=datetime19.,
|
||||
DD_TYPE char(16),
|
||||
DD_SOURCE char(2048),
|
||||
DD_SHORTDESC char(256),
|
||||
constraint pk primary key(tx_from, dd_type,dd_source),
|
||||
constraint unq unique(tx_from, dd_type),
|
||||
constraint nnn not null(DD_SHORTDESC)
|
||||
);
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%mp_getconstraints(lib=work,ds=example,outds=work.constraints)
|
||||
%mp_assertscope(COMPARE)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%mf_nobs(work.constraints)=6),
|
||||
desc=Output table work.constraints created with correct number of records,
|
||||
outds=work.test_results
|
||||
)
|
||||
%end;
|
||||
%else %do;
|
||||
proc sql;
|
||||
create table work.example(
|
||||
TX_FROM float format=datetime19.,
|
||||
DD_TYPE char(16),
|
||||
DD_SOURCE char(2048),
|
||||
DD_SHORTDESC char(256)
|
||||
);
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%mp_getconstraints(lib=work,ds=example,outds=work.constraints)
|
||||
%mp_assertscope(COMPARE)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%mf_nobs(work.constraints)=0),
|
||||
desc=Empty table created as constraints not supported,
|
||||
outds=work.test_results
|
||||
)
|
||||
%end;
|
||||
%mend conditional;
|
||||
|
||||
%conditional()
|
||||
23
tests/base/mp_getddl.test.sas
Normal file
23
tests/base/mp_getddl.test.sas
Normal file
@@ -0,0 +1,23 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_getddl.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_getddl.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
data test(index=(pk=(x y)/unique /nomiss));
|
||||
x=1;
|
||||
y='blah';
|
||||
label x='blah';
|
||||
run;
|
||||
proc sql; describe table &syslast;
|
||||
%mp_getddl(work,test,flavour=tsql,showlog=YES)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=mp_getddl runs without errors,
|
||||
outds=work.test_results
|
||||
)
|
||||
76
tests/base/mp_getformats.test.sas
Normal file
76
tests/base/mp_getformats.test.sas
Normal file
@@ -0,0 +1,76 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_getformats.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_mkdir.sas
|
||||
@li mp_getformats.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
/**
|
||||
* Test - setup
|
||||
*/
|
||||
|
||||
%mf_mkdir(&sasjswork/path1)
|
||||
%mf_mkdir(&sasjswork/path2)
|
||||
|
||||
libname path1 "&sasjswork/path1";
|
||||
libname path2 "&sasjswork/path2";
|
||||
|
||||
|
||||
PROC FORMAT library=path1;
|
||||
value whichpath 0 = 'path1' other='big fat problem if not path1';
|
||||
PROC FORMAT library=path2;
|
||||
value whichpath 0 = 'path2' other='big fat problem if not path2';
|
||||
RUN;
|
||||
|
||||
|
||||
/** run with path1 path2 FMTSEARCH */
|
||||
options insert=(fmtsearch=(path1 path2));
|
||||
data _null_;
|
||||
test=0;
|
||||
call symputx('test1',put(test,whichpath.));
|
||||
run;
|
||||
%mp_assert(
|
||||
iftrue=("&test1"="path1"),
|
||||
desc=Check correct format is applied,
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_getformats(fmtlist=WHICHPATH,outsummary=sum,outdetail=detail1)
|
||||
%let tst1=0;
|
||||
data _null_;
|
||||
set detail1;
|
||||
if fmtname='WHICHPATH' and start='**OTHER**' then call symputx('tst1',label);
|
||||
putlog (_all_)(=);
|
||||
run;
|
||||
%mp_assert(
|
||||
iftrue=("&tst1"="big fat problem if not path1"),
|
||||
desc=Check correct detail results are applied,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/** run with path2 path1 FMTSEARCH */
|
||||
options insert=(fmtsearch=(path2 path1));
|
||||
data _null_;
|
||||
test=0;
|
||||
call symputx('test2',put(test,whichpath.));
|
||||
run;
|
||||
%mp_assert(
|
||||
iftrue=("&test2"="path2"),
|
||||
desc=Check correct format is applied,
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_getformats(fmtlist=WHICHPATH,outsummary=sum,outdetail=detail2)
|
||||
%let tst2=0;
|
||||
data _null_;
|
||||
set detail2;
|
||||
if fmtname='WHICHPATH' and start='**OTHER**' then call symputx('tst2',label);
|
||||
putlog (_all_)(=);
|
||||
run;
|
||||
%mp_assert(
|
||||
iftrue=("&tst2"="big fat problem if not path2"),
|
||||
desc=Check correct detail results are applied,
|
||||
outds=work.test_results
|
||||
)
|
||||
118
tests/base/mp_getmaxvarlengths.test.sas
Normal file
118
tests/base/mp_getmaxvarlengths.test.sas
Normal file
@@ -0,0 +1,118 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_getmaxvarlengths macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_getmaxvarlengths.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertdsobs.sas
|
||||
@li mp_assertscope.sas
|
||||
|
||||
**/
|
||||
|
||||
data work.class ;
|
||||
attrib
|
||||
Name length= $8
|
||||
Sex length= $1
|
||||
Age length= 8
|
||||
Height length= 8
|
||||
Weight length= 8
|
||||
;
|
||||
infile cards dsd;
|
||||
input
|
||||
Name :$char.
|
||||
Sex :$char.
|
||||
Age
|
||||
Height
|
||||
Weight
|
||||
;
|
||||
datalines4;
|
||||
Alfred,M,14,69,112.5
|
||||
Alice,F,13,56.5,84
|
||||
Barbara,F,13,65.3,98
|
||||
Carol,F,14,62.8,102.5
|
||||
Henry,M,14,63.5,102.5
|
||||
James,M,12,57.3,83
|
||||
Jane,F,12,59.8,84.5
|
||||
Janet,F,15,62.5,112.5
|
||||
Jeffrey,M,13,62.5,84
|
||||
John,M,12,59,99.5
|
||||
Joyce,F,11,51.3,50.5
|
||||
Judy,F,14,64.3,90
|
||||
Louise,F,12,56.3,77
|
||||
Mary,F,15,66.5,112
|
||||
Philip,M,16,72,150
|
||||
Robert,M,12,64.8,128
|
||||
Ronald,M,15,67,133
|
||||
Thomas,M,11,57.5,85
|
||||
William,M,15,66.5,112
|
||||
;;;;
|
||||
run;
|
||||
|
||||
/* regular usage */
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%mp_getmaxvarlengths(work.class,outds=work.myds)
|
||||
%mp_assertscope(COMPARE,desc=checking scope leakage on mp_getmaxvarlengths)
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=No errs
|
||||
)
|
||||
%mp_assertdsobs(work.myds,
|
||||
desc=Has 5 records,
|
||||
test=EQUALS 5
|
||||
)
|
||||
data work.errs;
|
||||
set work.myds;
|
||||
if name='Name' and maxlen ne 7 then output;
|
||||
if name='Sex' and maxlen ne 1 then output;
|
||||
if name='Age' and maxlen ne 3 then output;
|
||||
if name='Height' and maxlen ne 8 then output;
|
||||
if name='Weight' and maxlen ne 3 then output;
|
||||
run;
|
||||
data _null_;
|
||||
set work.errs;
|
||||
putlog (_all_)(=);
|
||||
run;
|
||||
|
||||
%mp_assertdsobs(work.errs,
|
||||
desc=Err table has 0 records,
|
||||
test=EQUALS 0
|
||||
)
|
||||
|
||||
/* test2 */
|
||||
data work.test2;
|
||||
length a 3 b 5;
|
||||
a=1/3;
|
||||
b=1/3;
|
||||
c=1/3;
|
||||
d=._;
|
||||
e=.;
|
||||
output;
|
||||
output;
|
||||
run;
|
||||
%mp_getmaxvarlengths(work.test2,outds=work.myds2)
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=No errs in second test (with nulls)
|
||||
)
|
||||
%mp_assertdsobs(work.myds2,
|
||||
desc=Has 5 records,
|
||||
test=EQUALS 5
|
||||
)
|
||||
data work.errs2;
|
||||
set work.myds2;
|
||||
if name='a' and maxlen ne 3 then output;
|
||||
if name='b' and maxlen ne 5 then output;
|
||||
if name='c' and maxlen ne 8 then output;
|
||||
if name='d' and maxlen ne 3 then output;
|
||||
if name='e' and maxlen ne 0 then output;
|
||||
run;
|
||||
data _null_;
|
||||
set work.errs2;
|
||||
putlog (_all_)(=);
|
||||
run;
|
||||
|
||||
%mp_assertdsobs(work.errs2,
|
||||
desc=Err table has 0 records,
|
||||
test=EQUALS 0
|
||||
)
|
||||
137
tests/base/mp_getpk.test.sas
Normal file
137
tests/base/mp_getpk.test.sas
Normal file
@@ -0,0 +1,137 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_getpk.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_nobs.sas
|
||||
@li mp_getpk.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertdsobs.sas
|
||||
|
||||
<h4> Related Macros </h4>
|
||||
@li mp_getpk.sas
|
||||
|
||||
**/
|
||||
|
||||
/* ensure PK arrives in corrrect order */
|
||||
proc sql;
|
||||
create table work.example1(
|
||||
TX_FROM float format=datetime19.,
|
||||
DD_TYPE char(16),
|
||||
DD_SOURCE char(2048),
|
||||
DD_SHORTDESC char(256),
|
||||
constraint pk primary key(tx_from, dd_type,dd_source),
|
||||
constraint unq unique(tx_from, dd_type),
|
||||
constraint nnn not null(DD_SHORTDESC)
|
||||
);
|
||||
%mp_getpk(work,ds=example1,outds=test1)
|
||||
|
||||
data _null_;
|
||||
set work.test1;
|
||||
call symputx('test1',pk_fields);
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=("&test1"="TX_FROM DD_TYPE DD_SOURCE"),
|
||||
desc=mp_getpk gets regular PK values in correct order,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* unique key with NOT NULL captured */
|
||||
proc sql;
|
||||
create table work.example2(
|
||||
TX_FROM float format=datetime19.,
|
||||
DD_TYPE char(16),
|
||||
DD_SOURCE char(2048),
|
||||
DD_SHORTDESC char(256),
|
||||
constraint unq1 unique(tx_from, dd_type),
|
||||
constraint unq2 unique(tx_from, dd_type, dd_source),
|
||||
constraint nnn not null(tx_from),
|
||||
constraint nnnn not null(dd_type)
|
||||
);
|
||||
%mp_getpk(work,ds=example2,outds=test2)
|
||||
|
||||
data _null_;
|
||||
set work.test2;
|
||||
call symputx('test2',pk_fields);
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=("&test2"="TX_FROM DD_TYPE"),
|
||||
desc=mp_getpk gets unique constraint with NOT NULL in correct order
|
||||
)
|
||||
|
||||
/* unique key without NOT NULL NOT captured */
|
||||
proc sql;
|
||||
create table work.example3(
|
||||
TX_FROM float format=datetime19.,
|
||||
DD_TYPE char(16),
|
||||
DD_SOURCE char(2048),
|
||||
DD_SHORTDESC char(256),
|
||||
constraint unq1 unique(tx_from, dd_type),
|
||||
constraint unq2 unique(tx_from, dd_type, dd_source),
|
||||
constraint nnn not null(tx_from)
|
||||
);
|
||||
%mp_getpk(work,ds=example3,outds=test3)
|
||||
|
||||
data _null_;
|
||||
set work.test3;
|
||||
call symputx('test3',pk_fields);
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=("&test3 "=" "),
|
||||
desc=mp_getpk does not capture unique constraint without NOT NULL,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* constraint capture at library level is functional - uses first 2 tests */
|
||||
%mp_getpk(work,outds=test4)
|
||||
|
||||
%mp_assertdsobs(work.test4,test=ATLEAST 2)
|
||||
|
||||
/* unique & not null INDEX captured */
|
||||
proc sql;
|
||||
create table work.example5(
|
||||
TX_FROM float format=datetime19.,
|
||||
DD_TYPE char(16),
|
||||
DD_SOURCE char(2048),
|
||||
DD_SHORTDESC char(256)
|
||||
);
|
||||
proc datasets lib=work noprint;
|
||||
modify example5;
|
||||
index create tx_from /nomiss unique;
|
||||
quit;
|
||||
%mp_getpk(work,ds=example5,outds=test5)
|
||||
data _null_;
|
||||
set work.test5;
|
||||
call symputx('test5',pk_fields);
|
||||
run;
|
||||
%mp_assert(
|
||||
iftrue=("&test5"="TX_FROM"),
|
||||
desc=mp_getpk captures single column not null unique index,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* unique & not null COMPOSITE INDEX captured */
|
||||
proc sql;
|
||||
create table work.example6(
|
||||
TX_FROM float format=datetime19.,
|
||||
DD_TYPE char(16),
|
||||
DD_SOURCE char(2048),
|
||||
DD_SHORTDESC char(256)
|
||||
);
|
||||
proc datasets lib=work noprint;
|
||||
modify example6;
|
||||
index create pk_6=(tx_from dd_type) /nomiss unique;
|
||||
quit;
|
||||
%mp_getpk(work,ds=example6,outds=test6)
|
||||
data _null_;
|
||||
set work.test6;
|
||||
call symputx('test6',pk_fields);
|
||||
run;
|
||||
%mp_assert(
|
||||
iftrue=("&test6"="TX_FROM DD_TYPE"),
|
||||
desc=mp_getpk captures multiple column not null unique index,
|
||||
outds=work.test_results
|
||||
)
|
||||
77
tests/base/mp_gsubfile.test.sas
Normal file
77
tests/base/mp_gsubfile.test.sas
Normal file
@@ -0,0 +1,77 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_gsubfile.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_gsubfile.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
|
||||
%macro gsubtest();
|
||||
%if "%substr(&sysver.XX,1,4)"="V.04" %then %do;
|
||||
%put %str(ERR)OR: Viya 4 does not support the IO library in lua;
|
||||
%return;
|
||||
%end;
|
||||
|
||||
/**
|
||||
* test 1 - simple replace
|
||||
*/
|
||||
%global str1;
|
||||
%let file=%sysfunc(pathname(work))/file.txt;
|
||||
%let pat=replace/me;
|
||||
%let str=with/this;
|
||||
data _null_;
|
||||
file "&file";
|
||||
put "&pat";
|
||||
run;
|
||||
%mp_gsubfile(file=&file, patternvar=pat, replacevar=str)
|
||||
data _null_;
|
||||
infile "&file";
|
||||
input;
|
||||
call symputx('str1',_infile_);
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=("&str1"="&str"),
|
||||
desc=Check that simple replacement was successful,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/**
|
||||
* test 2 - replace from additional line
|
||||
*/
|
||||
%global str2 strcheck2 strcheck2b;
|
||||
%let file2=%sysfunc(pathname(work))/file2.txt;
|
||||
%let pat2=replace/me;
|
||||
%let str2=with/this;
|
||||
data _null_;
|
||||
file "&file2";
|
||||
put 'line1';output;
|
||||
put "&pat2";output;
|
||||
put "&pat2";output;
|
||||
run;
|
||||
%mp_gsubfile(file=&file2, patternvar=pat2, replacevar=str2)
|
||||
data _null_;
|
||||
infile "&file2";
|
||||
input;
|
||||
if _n_=2 then call symputx('strcheck2',_infile_);
|
||||
if _n_=3 then call symputx('strcheck2b',_infile_);
|
||||
putlog _infile_;
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=("&strcheck2"="&str2"),
|
||||
desc=Check that multi line replacement was successful (line2),
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=("&strcheck2b"="&str2"),
|
||||
desc=Check that multi line replacement was successful (line3),
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mend gsubtest;
|
||||
|
||||
%gsubtest()
|
||||
61
tests/base/mp_hashdataset.test.sas
Normal file
61
tests/base/mp_hashdataset.test.sas
Normal file
@@ -0,0 +1,61 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_hashdataset.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_nobs.sas
|
||||
@li mp_hashdataset.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertscope.sas
|
||||
|
||||
**/
|
||||
|
||||
/* test 1 - regular DS */
|
||||
data work.test;
|
||||
set sashelp.vextfl;
|
||||
missval=.;
|
||||
misscval='';
|
||||
run;
|
||||
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%mp_hashdataset(test)
|
||||
%mp_assertscope(COMPARE)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Regular test works,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_hashdataset(test,outds=work.test2)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=hash with output runs without errors,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%mf_nobs(work.test2)=1),
|
||||
desc=output has 1 row,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
|
||||
data work.test3a;
|
||||
set work.test;
|
||||
stop;
|
||||
run;
|
||||
%mp_hashdataset(test3a,outds=work.test3b)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=hash with zero-row input runs without errors,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%mf_nobs(work.test3b)=1),
|
||||
desc=test 3 output has 1 row,
|
||||
outds=work.test_results
|
||||
)
|
||||
24
tests/base/mp_init.test.sas
Normal file
24
tests/base/mp_init.test.sas
Normal file
@@ -0,0 +1,24 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_gsubfile.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_init.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
/**
|
||||
* Test 1 - mp_init.sas actually already ran as part of testinit
|
||||
* So lets test to make sure it will not run again
|
||||
*/
|
||||
|
||||
%let initial_value=&sasjs_init_num;
|
||||
|
||||
%mp_init()
|
||||
|
||||
%mp_assert(
|
||||
iftrue=("&initial_value"="&sasjs_init_num"),
|
||||
desc=Check that mp_init() did not run twice,
|
||||
outds=work.test_results
|
||||
)
|
||||
47
tests/base/mp_jsonout.test.1.sas
Normal file
47
tests/base/mp_jsonout.test.1.sas
Normal file
@@ -0,0 +1,47 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_jsonout.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_jsonout.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
filename webref temp;
|
||||
|
||||
data demo;
|
||||
dtval=date();
|
||||
format dtval date9.;
|
||||
compare=put(date(),date9.);
|
||||
call symputx('compare',compare);
|
||||
run;
|
||||
|
||||
%mp_jsonout(OPEN,jref=webref)
|
||||
%mp_jsonout(OBJ,demo,jref=webref,fmt=Y)
|
||||
%mp_jsonout(CLOSE,jref=webref)
|
||||
|
||||
data _null_;
|
||||
infile webref;
|
||||
input;
|
||||
putlog _infile_;
|
||||
run;
|
||||
|
||||
libname web JSON fileref=webref;
|
||||
%let dtval=0;
|
||||
data work.test;
|
||||
set web.demo;
|
||||
call symputx('dtval',dtval);
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Checking for error condition,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&dtval=&compare),
|
||||
desc=Checking tables were created successfully,
|
||||
outds=work.test_results
|
||||
)
|
||||
52
tests/base/mp_jsonout.test.2.sas
Normal file
52
tests/base/mp_jsonout.test.2.sas
Normal file
@@ -0,0 +1,52 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_jsonout.sas macro with special missings
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_jsonout.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
filename webref temp;
|
||||
|
||||
data demo;
|
||||
do x=._,.,.a,.b,.c,.d,.e,-99, 0, 1,2, 3.333333;
|
||||
output;
|
||||
end;
|
||||
run;
|
||||
%mp_jsonout(OPEN,jref=webref)
|
||||
%mp_jsonout(OBJ,demo,jref=webref,fmt=N,missing=STRING)
|
||||
%mp_jsonout(CLOSE,jref=webref)
|
||||
|
||||
data _null_;
|
||||
infile webref;
|
||||
input;
|
||||
putlog _infile_;
|
||||
run;
|
||||
|
||||
libname web JSON fileref=webref;
|
||||
|
||||
/* proc json turns to char - so switch back to numeric */
|
||||
data work.test(keep=x);
|
||||
set web.demo(rename=(x=y));
|
||||
if y ='_' then x=._;
|
||||
else if anyalpha(y) then x=input(cats(".",y),best.);
|
||||
else x=input(y,best.);
|
||||
put (_all_)(=);
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Checking for error condition with special missing export,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
proc compare base=work.demo compare=work.test;
|
||||
quit;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&sysinfo=0),
|
||||
desc=Returned json is identical to input table for all special missings,
|
||||
outds=work.test_results
|
||||
)
|
||||
53
tests/base/mp_jsonout.test.3.sas
Normal file
53
tests/base/mp_jsonout.test.3.sas
Normal file
@@ -0,0 +1,53 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_jsonout.sas macro with non-standard chars
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_jsonout.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
filename webref temp;
|
||||
|
||||
data demo;
|
||||
do x='"','0A'x,'0D'x,'09'x,'00'x,'0E'x,'0F'x,'01'x,'02'x,'10'x,'11'x,'\';
|
||||
output;
|
||||
end;
|
||||
run;
|
||||
%mp_jsonout(OPEN,jref=webref)
|
||||
%mp_jsonout(OBJ,demo,jref=webref)
|
||||
%mp_jsonout(CLOSE,jref=webref)
|
||||
|
||||
data _null_;
|
||||
infile webref;
|
||||
input;
|
||||
putlog _infile_;
|
||||
run;
|
||||
|
||||
libname web JSON fileref=webref;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Checking for error condition with special chars export,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/*
|
||||
data _null_;
|
||||
set work.demo (in=start) web.demo (in=end);
|
||||
put (_all_)(=);
|
||||
run;
|
||||
proc sql;
|
||||
describe table work.demo;
|
||||
describe table web.demo;
|
||||
*/
|
||||
|
||||
proc compare base=work.demo compare=web.demo(keep=x);
|
||||
quit;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&sysinfo=0),
|
||||
desc=Returned json is identical to input table for all special chars,
|
||||
outds=work.test_results
|
||||
)
|
||||
44
tests/base/mp_lib2inserts.test.sas
Normal file
44
tests/base/mp_lib2inserts.test.sas
Normal file
@@ -0,0 +1,44 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_ds2inserts.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_mkdir.sas
|
||||
@li mp_getddl.sas
|
||||
@li mp_lib2inserts.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
/* grab 20 datasets from SASHELP */
|
||||
%let work=%sysfunc(pathname(work));
|
||||
%let path=&work/new;
|
||||
%mf_mkdir(&path)
|
||||
libname sashlp "&work";
|
||||
proc sql noprint;
|
||||
create table members as
|
||||
select distinct lowcase(memname) as memname
|
||||
from dictionary.tables
|
||||
where upcase(libname)="SASHELP"
|
||||
and memtype='DATA'; /* exclude views */
|
||||
data _null_;
|
||||
set work.members;
|
||||
call execute(cats('data sashlp.',memname,';set sashelp.',memname,';run;'));
|
||||
if _n_>20 then stop;
|
||||
run;
|
||||
|
||||
/* export DDL and inserts */
|
||||
%mp_getddl(sashlp, schema=work, fref=tempref)
|
||||
%mp_lib2inserts(sashlp, schema=work, outref=tempref,maxobs=50)
|
||||
|
||||
/* check if it actually runs */
|
||||
libname sashlp "&path";
|
||||
options source2;
|
||||
%inc tempref;
|
||||
|
||||
/* without errors.. */
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Able to export 20 tables from sashelp using mp_lib2inserts,
|
||||
outds=work.test_results
|
||||
)
|
||||
93
tests/base/mp_loadformat.test.sas
Normal file
93
tests/base/mp_loadformat.test.sas
Normal file
@@ -0,0 +1,93 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_loadformat.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mddl_dc_difftable.sas
|
||||
@li mp_loadformat.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertscope.sas
|
||||
|
||||
**/
|
||||
|
||||
/* prep format catalog */
|
||||
libname perm (work);
|
||||
|
||||
%mddl_dc_difftable(libds=perm.audit)
|
||||
|
||||
data work.loadfmts;
|
||||
length fmtname $32;
|
||||
eexcl='Y';
|
||||
type='N';
|
||||
do i=1 to 100;
|
||||
fmtname=cats('SASJS_',i,'X');
|
||||
do j=1 to 100;
|
||||
start=cats(j);
|
||||
end=cats(j+1);
|
||||
label= cats('Dummy ',start);
|
||||
output;
|
||||
end;
|
||||
end;
|
||||
run;
|
||||
proc format cntlin=work.loadfmts library=perm.testcat;
|
||||
run;
|
||||
|
||||
/* make some test data */
|
||||
data work.stagedata;
|
||||
set work.loadfmts;
|
||||
type='N';
|
||||
eexcl='Y';
|
||||
if _n_<150 then deleteme='Yes';
|
||||
else if _n_<250 then label='mod'!!cats(_n_);
|
||||
else if _n_<350 then do;
|
||||
start=cats(_n_);
|
||||
end=cats(_n_+1);
|
||||
label='newval'!!cats(_N_);
|
||||
end;
|
||||
else stop;
|
||||
run;
|
||||
|
||||
/* load the above */
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%mp_loadformat(perm.testcat
|
||||
,work.stagedata
|
||||
,loadtarget=YES
|
||||
,auditlibds=perm.audit
|
||||
,locklibds=0
|
||||
,delete_col=deleteme
|
||||
,outds_add=add_test1
|
||||
,outds_del=del_test1
|
||||
,outds_mod=mod_test1
|
||||
,mdebug=1
|
||||
)
|
||||
%mp_assertscope(COMPARE)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(%mf_nobs(del_test1)=149),
|
||||
desc=Test 1 - delete obs,
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%mf_nobs(add_test1)=100),
|
||||
desc=Test 1 - add obs,
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%mf_nobs(mod_test1)=100),
|
||||
desc=Test 1 - mod obs,
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%mf_nobs(perm.audit)=7329),
|
||||
desc=Test 1 - audit table updated,
|
||||
outds=work.test_results
|
||||
)
|
||||
data work.difftest;
|
||||
set perm.audit;
|
||||
where is_diff=1;
|
||||
run;
|
||||
%mp_assert(
|
||||
iftrue=(%mf_nobs(work.difftest)>0),
|
||||
desc=Test 1 - diffs were found,
|
||||
outds=work.test_results
|
||||
)
|
||||
63
tests/base/mp_lockanytable.test.sas
Normal file
63
tests/base/mp_lockanytable.test.sas
Normal file
@@ -0,0 +1,63 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_lockfilecheck macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_lockanytable.sas
|
||||
@li mp_assertcols.sas
|
||||
@li mp_assertcolvals.sas
|
||||
@li mp_coretable.sas
|
||||
|
||||
**/
|
||||
|
||||
/* check create table */
|
||||
|
||||
%mp_coretable(LOCKTABLE,libds=work.controller)
|
||||
|
||||
%mp_assertcols(work.controller,
|
||||
cols=lock_status_cd lock_lib lock_ds lock_user_nm lock_ref lock_pid
|
||||
lock_start_dttm lock_end_dttm,
|
||||
test=ALL,
|
||||
desc=check all control columns exist
|
||||
)
|
||||
|
||||
/* check lock table */
|
||||
options dlcreatedir;
|
||||
libname tmp "%sysfunc(pathname(work))/tmp";
|
||||
data tmp.sometable;
|
||||
x=1;
|
||||
run;
|
||||
|
||||
%mp_lockanytable(LOCK,lib=tmp,ds=sometable,ref=This Ref, ctl_ds=work.controller)
|
||||
|
||||
data work.checkds1;
|
||||
checkval='SOMETABLE';
|
||||
run;
|
||||
%mp_assertcolvals(work.controller.lock_ds,
|
||||
checkvals=work.checkds1.checkval,
|
||||
desc=table is captured in lock,
|
||||
test=ANYVAL
|
||||
)
|
||||
|
||||
data work.checkds2;
|
||||
checkval='LOCKED';
|
||||
run;
|
||||
%mp_assertcolvals(work.controller.lock_status_cd,
|
||||
checkvals=work.checkds2.checkval,
|
||||
desc=code is captured in lock,
|
||||
test=ANYVAL
|
||||
)
|
||||
|
||||
|
||||
|
||||
/* check for unsuccessful unlock */
|
||||
%mp_lockanytable(UNLOCK,lib=tmp,ds=sometable,ref=bye, ctl_ds=work.controller)
|
||||
|
||||
data work.checkds3;
|
||||
checkval='UNLOCKED';
|
||||
run;
|
||||
%mp_assertcolvals(work.controller.lock_status_cd,
|
||||
checkvals=work.checkds3.checkval,
|
||||
desc=Ref is captured in unlock,
|
||||
test=ANYVAL
|
||||
)
|
||||
39
tests/base/mp_lockfilecheck.test.sas
Normal file
39
tests/base/mp_lockfilecheck.test.sas
Normal file
@@ -0,0 +1,39 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_lockfilecheck macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_lockfilecheck.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_reseterror.sas
|
||||
|
||||
**/
|
||||
|
||||
|
||||
/* check for regular lock */
|
||||
data work.test; a=1;run;
|
||||
%mp_lockfilecheck(work.test)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Checking regular table can be locked,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
|
||||
/* check for unsuccessful lock */
|
||||
%global success abortme;
|
||||
%let success=0;
|
||||
%macro mp_abort(iftrue=,mac=,msg=);
|
||||
%if &abortme=1 %then %let success=1;
|
||||
%mend mp_abort;
|
||||
|
||||
%mp_lockfilecheck(sashelp.class)
|
||||
|
||||
%mp_reseterror()
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&success=1),
|
||||
desc=Checking sashelp table cannot be locked,
|
||||
outds=work.test_results
|
||||
)
|
||||
59
tests/base/mp_makedata.test.sas
Normal file
59
tests/base/mp_makedata.test.sas
Normal file
@@ -0,0 +1,59 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_makedata.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_nobs.sas
|
||||
@li mp_makedata.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
/**
|
||||
* Test 1 - Regular makedata call
|
||||
*/
|
||||
|
||||
proc sql;
|
||||
create table work.example(
|
||||
TX_FROM float format=datetime19.,
|
||||
DD_TYPE char(16),
|
||||
DD_SOURCE char(2048),
|
||||
DD_SHORTDESC char(256),
|
||||
constraint pk primary key(tx_from, dd_type,dd_source),
|
||||
constraint nnn not null(DD_SHORTDESC)
|
||||
);
|
||||
%mp_makedata(work.example,obs=500)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=("%mf_nobs(work.example)"="500"),
|
||||
desc=Check that 500 rows were created,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
data _null_;
|
||||
set work.example;
|
||||
call symputx('lenvar',length(dd_source));
|
||||
stop;
|
||||
run;
|
||||
%mp_assert(
|
||||
iftrue=("&lenvar"="2048"),
|
||||
desc=Check that entire length of variable is populated,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
|
||||
proc sql;
|
||||
create table work.example2(
|
||||
TX_FROM float format=datetime19.,
|
||||
DD_TYPE char(16),
|
||||
DD_SOURCE char(2048),
|
||||
DD_SHORTDESC char(256),
|
||||
some_num num
|
||||
);
|
||||
%mp_makedata(work.example2)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Ensure tables without keys still generate,
|
||||
outds=work.test_results
|
||||
)
|
||||
41
tests/base/mp_md5.test.sas
Normal file
41
tests/base/mp_md5.test.sas
Normal file
@@ -0,0 +1,41 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_md5.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_md5.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertscope.sas
|
||||
|
||||
**/
|
||||
%global hash1 hash2 hash3;
|
||||
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
data work.test1 /nonote2err;
|
||||
c1='';
|
||||
c2=repeat('x',32767);
|
||||
c3=' f';
|
||||
n1=.a;
|
||||
n2=.;
|
||||
n3=1.0000000001;
|
||||
hash=%mp_md5(cvars=c1 c2 c3,nvars=n1 n2 n3);
|
||||
call symputx('hash1',hash);
|
||||
n1=.b;
|
||||
hash=%mp_md5(cvars=c1 c2 c3,nvars=n1 n2 n3);
|
||||
call symputx('hash2',hash);
|
||||
c3='f';
|
||||
hash=%mp_md5(cvars=c1 c2 c3,nvars=n1 n2 n3);
|
||||
call symputx('hash3',hash);
|
||||
run;
|
||||
%mp_assertscope(COMPARE,ignorelist=HASH1 HASH2 HASH3)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=("&hash1" ne "&hash2"),
|
||||
desc=Checking first hash diff,
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=("&hash2" ne "&hash3"),
|
||||
desc=Checking first hash diff,
|
||||
outds=work.test_results
|
||||
)
|
||||
95
tests/base/mp_replace.test.sas
Normal file
95
tests/base/mp_replace.test.sas
Normal file
@@ -0,0 +1,95 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_replace.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_replace.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertscope.sas
|
||||
|
||||
**/
|
||||
|
||||
|
||||
%let test1="&sasjswork/file.txt";
|
||||
%let str=replace/me;
|
||||
%let rep=with/this;
|
||||
data _null_;
|
||||
file &test1;
|
||||
put 'blahblah';
|
||||
put "blahblah&str.blah";
|
||||
put 'blahblahblah';
|
||||
run;
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%mp_replace(&test1, findvar=str, replacevar=rep)
|
||||
%mp_assertscope(COMPARE)
|
||||
data _null_;
|
||||
infile &test1;
|
||||
input;
|
||||
if _n_=2 then call symputx('test1result',_infile_);
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=("&test1result" = "blahblah&rep.blah"),
|
||||
desc=Checking first replace,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
|
||||
%let test2="&sasjswork/file2.txt";
|
||||
%let str=%str(replacewith trailing spaces );
|
||||
%let rep=%str( with more spaces );
|
||||
data _null_;
|
||||
file &test2 lrecl=500;
|
||||
put 'blahblah';
|
||||
put "blahblah&str.blah&str. replace &str.X";
|
||||
put "blahbreplacewith&str.spacesahblah";
|
||||
run;
|
||||
%mp_replace(&test2, findvar=str, replacevar=rep)
|
||||
|
||||
data _null_;
|
||||
infile &test2 lrecl=500;
|
||||
input;
|
||||
if _n_=2 then call symputx('test2resulta',_infile_);
|
||||
if _n_=3 then call symputx('test2resultb',_infile_);
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=("&test2resulta" = "blahblah&rep.blah&rep. replace &rep.X"),
|
||||
desc=Checking second replace 2nd row,
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=("&test2resultb" = "blahbreplacewith&rep.spacesahblah"),
|
||||
desc=Checking second replace 3rd row,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
|
||||
%let test3="&sasjswork/file3.txt";
|
||||
%let str=%str(replace.string.with.dots );
|
||||
%let rep=%str( more.dots);
|
||||
data _null_;
|
||||
file &test3 lrecl=500;
|
||||
put 'blahblah';
|
||||
put "blahblah&str.blah&str. replace &str.X";
|
||||
put "blahbreplacewith&str.spacesahblah";
|
||||
run;
|
||||
%mp_replace(&test3, findvar=str, replacevar=rep)
|
||||
|
||||
data _null_;
|
||||
infile &test3 lrecl=500;
|
||||
input;
|
||||
if _n_=2 then call symputx('test3resulta',_infile_);
|
||||
if _n_=3 then call symputx('test3resultb',_infile_);
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=("&test3resulta" = "blahblah&rep.blah&rep. replace &rep.X"),
|
||||
desc=Checking third replace 2nd row (dots),
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=("&test3resultb" = "blahbreplacewith&rep.spacesahblah"),
|
||||
desc=Checking third replace 3rd row (dots),
|
||||
outds=work.test_results
|
||||
)
|
||||
23
tests/base/mp_reseterror.test.sas
Normal file
23
tests/base/mp_reseterror.test.sas
Normal file
@@ -0,0 +1,23 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_reseterror macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_assert.sas
|
||||
@li mp_reseterror.sas
|
||||
|
||||
**/
|
||||
|
||||
|
||||
/* cause an error */
|
||||
|
||||
lock sashelp.class;
|
||||
|
||||
/* recover ? */
|
||||
%mp_reseterror()
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Checking error condition was fixed,
|
||||
outds=work.test_results
|
||||
)
|
||||
31
tests/base/mp_resetoption.test.sas
Normal file
31
tests/base/mp_resetoption.test.sas
Normal file
@@ -0,0 +1,31 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_resetoption macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_assert.sas
|
||||
@li mp_assertscope.sas
|
||||
@li mp_resetoption.sas
|
||||
|
||||
**/
|
||||
|
||||
|
||||
%let orig=%sysfunc(getoption(obs));
|
||||
|
||||
options obs=30;
|
||||
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%mp_resetoption(OBS)
|
||||
%mp_assertscope(COMPARE)
|
||||
|
||||
%let new=%sysfunc(ifc(
|
||||
"%substr(&sysver,1,1)" ne "4" and "%substr(&sysver,1,1)" ne "5",
|
||||
%sysfunc(getoption(obs)), /* test it worked */
|
||||
&orig /* cannot test as option unavailable */
|
||||
));
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&new=&orig),
|
||||
desc=Checking option was reset (if reset option available),
|
||||
outds=work.test_results
|
||||
)
|
||||
116
tests/base/mp_retainedkey.test.sas
Normal file
116
tests/base/mp_retainedkey.test.sas
Normal file
@@ -0,0 +1,116 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_retainedkey macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_assert.sas
|
||||
@li mp_assertcolvals.sas
|
||||
@li mp_retainedkey.sas
|
||||
|
||||
**/
|
||||
|
||||
/**
|
||||
* Setup base tables
|
||||
*/
|
||||
proc sql;
|
||||
create table work.maxkeytable(
|
||||
keytable varchar(41) label='Base table in libref.dataset format',
|
||||
keycolumn char(32) format=$32.
|
||||
label='The Retained key field containing the key values.',
|
||||
max_key num label=
|
||||
'Integer representing current max RK or SK value in the KEYTABLE',
|
||||
processed_dttm num format=E8601DT26.6
|
||||
label='Datetime this value was last updated',
|
||||
constraint pk_mpe_maxkeyvalues
|
||||
primary key(keytable));
|
||||
|
||||
create table work.locktable(
|
||||
lock_lib char(8),
|
||||
lock_ds char(32),
|
||||
lock_status_cd char(10) not null,
|
||||
lock_user_nm char(100) not null ,
|
||||
lock_ref char(200),
|
||||
lock_pid char(10),
|
||||
lock_start_dttm num format=E8601DT26.6,
|
||||
lock_end_dttm num format=E8601DT26.6,
|
||||
constraint pk_mp_lockanytable primary key(lock_lib,lock_ds));
|
||||
|
||||
data work.targetds;
|
||||
rk_col=_n_;
|
||||
set sashelp.class;
|
||||
run;
|
||||
|
||||
data work.appendtable;
|
||||
set sashelp.class;
|
||||
if mod(_n_,2)=0 then name=cats('New',_n_);
|
||||
if _n_<7;
|
||||
run;
|
||||
|
||||
libname x (work);
|
||||
|
||||
/** Test 1 - base case **/
|
||||
%mp_retainedkey(
|
||||
base_lib=X
|
||||
,base_dsn=targetds
|
||||
,append_lib=X
|
||||
,append_dsn=APPENDTABLE
|
||||
,retained_key=rk_col
|
||||
,business_key= name
|
||||
,check_uniqueness=NO
|
||||
,maxkeytable=0
|
||||
,locktable=0
|
||||
,outds=work.APPEND
|
||||
,filter_str=
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Checking errors in test 1,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
data work.check;
|
||||
do val=1,3,5,20,21,22;
|
||||
output;
|
||||
end;
|
||||
run;
|
||||
%mp_assertcolvals(work.append.rk_col,
|
||||
checkvals=work.check.val,
|
||||
desc=All values have a match,
|
||||
test=ALLVALS
|
||||
)
|
||||
|
||||
/** Test 2 - all new records, with metadata logging and unique check **/
|
||||
data work.targetds2;
|
||||
rk_col=_n_;
|
||||
set sashelp.class;
|
||||
run;
|
||||
|
||||
data work.appendtable2;
|
||||
set sashelp.class;
|
||||
do x=1 to 21;
|
||||
name=cats('New',x);
|
||||
output;
|
||||
end;
|
||||
stop;
|
||||
run;
|
||||
|
||||
%mp_retainedkey(base_dsn=targetds2
|
||||
,append_dsn=APPENDTABLE2
|
||||
,retained_key=rk_col
|
||||
,business_key= name
|
||||
,check_uniqueness=YES
|
||||
,maxkeytable=x.maxkeytable
|
||||
,locktable=work.locktable
|
||||
,outds=WORK.APPEND2
|
||||
,filter_str=
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Checking errors in test 2,
|
||||
outds=work.test_results
|
||||
)
|
||||
%mp_assert(
|
||||
iftrue=(%mf_nobs(work.append2)=21),
|
||||
desc=Checking append records created,
|
||||
outds=work.test_results
|
||||
)
|
||||
50
tests/base/mp_searchcols.test.sas
Normal file
50
tests/base/mp_searchcols.test.sas
Normal file
@@ -0,0 +1,50 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_searchcols.sas
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_searchcols.sas
|
||||
@li mp_assertdsobs.sas
|
||||
|
||||
|
||||
**/
|
||||
|
||||
|
||||
/** Test 1 - full col match */
|
||||
data example1;
|
||||
var1=1;
|
||||
var2=2;
|
||||
var3=3;
|
||||
data example2;
|
||||
var1=1;
|
||||
var2=2;
|
||||
data example3;
|
||||
var2=2;
|
||||
var3=3;
|
||||
data example4;
|
||||
matchmehere=1;
|
||||
data example5;
|
||||
hereyoucan_matchme_also=1;
|
||||
data example6;
|
||||
do_not_forget_me=1;
|
||||
data example7;
|
||||
we_shall_not_forget=1;
|
||||
run;
|
||||
|
||||
%mp_searchcols(libs=work,cols=var1 var2,outds=testme)
|
||||
|
||||
%mp_assertdsobs(work.testme,
|
||||
desc=Test1 - check exact variables are found,
|
||||
test=EQUALS 3,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* test 2 - wildcard match */
|
||||
|
||||
%mp_searchcols(libs=work,cols=matchme forget,match=WILD, outds=testme2)
|
||||
|
||||
%mp_assertdsobs(work.testme2,
|
||||
desc=Test1 - check fuzzy matches are found,
|
||||
test=EQUALS 4,
|
||||
outds=work.test_results
|
||||
)
|
||||
29
tests/base/mp_searchdata.test.sas
Normal file
29
tests/base/mp_searchdata.test.sas
Normal file
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_searchdata.sas
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_searchdata.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
|
||||
**/
|
||||
|
||||
/** Test 1 - generic useage */
|
||||
|
||||
%mp_searchdata(lib=sashelp, ds=class, string=a)
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=No errors in regular usage,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/** Test 2 - with obs issue */
|
||||
|
||||
%mp_searchdata(lib=sashelp, ds=class, string=l,outobs=5)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=("&SYSWARNINGTEXT" = ""),
|
||||
desc=Ensuring WARN status is clean,
|
||||
outds=work.test_results
|
||||
)
|
||||
69
tests/base/mp_sortinplace.test.sas
Normal file
69
tests/base/mp_sortinplace.test.sas
Normal file
@@ -0,0 +1,69 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_sortinplace.test.sas
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_sortinplace.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertdsobs.sas
|
||||
@li mp_getconstraints.sas
|
||||
|
||||
**/
|
||||
|
||||
|
||||
/** Test 1 - regular usage */
|
||||
proc sql;
|
||||
create table work.example as
|
||||
select * from sashelp.classfit;
|
||||
alter table work.example
|
||||
add constraint pk primary key(name);
|
||||
%mp_sortinplace(work.example)
|
||||
|
||||
%mp_getconstraints(lib=work,ds=example,outds=work.testme)
|
||||
|
||||
%mp_assertdsobs(work.testme,
|
||||
desc=Test1 - check constraints recreated,
|
||||
test=EQUALS 1,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%let test1=0;
|
||||
data _null_;
|
||||
set work.example;
|
||||
call symputx('test1',name);
|
||||
stop;
|
||||
run;
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
%str(&test1)=%str(Alfred)
|
||||
),
|
||||
desc=Check if sort was appplied,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/** Test 2 - table without PK */
|
||||
proc sql;
|
||||
create table work.example2 as
|
||||
select * from sashelp.classfit;
|
||||
%mp_sortinplace(work.example2)
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
%str(&syscc)=%str(0)
|
||||
),
|
||||
desc=Ensure no errors when no key exists,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%let test2=0;
|
||||
data _null_;
|
||||
set work.example2;
|
||||
call symputx('test2',name);
|
||||
stop;
|
||||
run;
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
%str(&test2)=%str(Alfred)
|
||||
),
|
||||
desc=Check if sort was appplied when no index exists,
|
||||
outds=work.test_results
|
||||
)
|
||||
302
tests/base/mp_stackdiffs.test.sas
Normal file
302
tests/base/mp_stackdiffs.test.sas
Normal file
@@ -0,0 +1,302 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_storediffs macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_assert.sas
|
||||
@li mp_assertcolvals.sas
|
||||
@li mp_assertdsobs.sas
|
||||
@li mp_assertscope.sas
|
||||
@li mp_stackdiffs.sas
|
||||
@li mp_storediffs.sas
|
||||
|
||||
**/
|
||||
|
||||
/* first, make some data */
|
||||
|
||||
data work.orig work.deleted work.changed work.appended;
|
||||
set sashelp.electric;
|
||||
if _n_ le 10 then do;
|
||||
output work.deleted;
|
||||
end;
|
||||
else if _n_ le 20 then do;
|
||||
output work.orig;
|
||||
coal=-1;
|
||||
coaltip='modified';
|
||||
output work.changed;
|
||||
end;
|
||||
else if _n_ le 30 then do;
|
||||
year=_n_;
|
||||
output work.appended;
|
||||
end;
|
||||
else stop;
|
||||
run;
|
||||
|
||||
%mp_storediffs(sashelp.electric
|
||||
,work.orig
|
||||
,CUSTOMER YEAR
|
||||
,delds=work.deleted
|
||||
,modds=work.changed
|
||||
,appds=work.appended
|
||||
,outds=work.final
|
||||
,mdebug=1
|
||||
)
|
||||
|
||||
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
|
||||
/**
|
||||
* Deletions test - where record does exist
|
||||
*/
|
||||
data work.orig1;
|
||||
set sashelp.electric;
|
||||
if _n_ le 10;
|
||||
run;
|
||||
data work.final1;
|
||||
set work.final;
|
||||
where move_type='D';
|
||||
run;
|
||||
%mp_stackdiffs(work.orig1
|
||||
,work.final1
|
||||
,CUSTOMER YEAR
|
||||
,mdebug=1
|
||||
,errds=work.errds1
|
||||
,outmod=work.mod1
|
||||
,outadd=work.add1
|
||||
,outdel=work.del1
|
||||
)
|
||||
%mp_assertdsobs(work.errds1,
|
||||
desc=Delete1 - no errs,
|
||||
test=EQUALS 0
|
||||
)
|
||||
%mp_assertdsobs(work.del1,
|
||||
desc=Delete1 - records populated,
|
||||
test=EQUALS 10
|
||||
)
|
||||
/**
|
||||
* Deletions test - where record does NOT exist
|
||||
*/
|
||||
data work.orig2;
|
||||
set work.orig;
|
||||
stop; /* empty table */
|
||||
run;
|
||||
data work.final2;
|
||||
set work.final;
|
||||
where move_type='D';
|
||||
run;
|
||||
%mp_stackdiffs(work.orig2
|
||||
,work.final2
|
||||
,CUSTOMER YEAR
|
||||
,mdebug=1
|
||||
,errds=work.errds2
|
||||
,outmod=work.mod2
|
||||
,outadd=work.add2
|
||||
,outdel=work.del2
|
||||
)
|
||||
%mp_assertdsobs(work.errds2,
|
||||
desc=Delete2 - has errs,
|
||||
test=EQUALS 10
|
||||
)
|
||||
%mp_assertdsobs(work.del2,
|
||||
desc=Delete2 - records not populated,
|
||||
test=EQUALS 0
|
||||
)
|
||||
|
||||
/**
|
||||
* Additions test - where record does not exist
|
||||
*/
|
||||
data work.orig3;
|
||||
set work.orig;
|
||||
stop;
|
||||
run;
|
||||
data work.final3;
|
||||
set work.final;
|
||||
where move_type='A';
|
||||
run;
|
||||
%mp_stackdiffs(work.orig3
|
||||
,work.final3
|
||||
,CUSTOMER YEAR
|
||||
,mdebug=1
|
||||
,errds=work.errds3
|
||||
,outmod=work.mod3
|
||||
,outadd=work.add3
|
||||
,outdel=work.del3
|
||||
)
|
||||
%mp_assertdsobs(work.errds3,
|
||||
desc=Add3 - no errs,
|
||||
test=EQUALS 0
|
||||
)
|
||||
%mp_assertdsobs(work.add3,
|
||||
desc=Add3 - records populated,
|
||||
test=EQUALS 10
|
||||
)
|
||||
|
||||
/**
|
||||
* Additions test - where record does exist
|
||||
*/
|
||||
data work.orig4;
|
||||
set sashelp.electric;
|
||||
if _n_ ge 20;
|
||||
year=_n_;
|
||||
if _n_>25 then stop;
|
||||
run;
|
||||
data work.final4;
|
||||
set work.final;
|
||||
where move_type='A';
|
||||
run;
|
||||
%mp_stackdiffs(work.orig4
|
||||
,work.final4
|
||||
,CUSTOMER YEAR
|
||||
,mdebug=1
|
||||
,errds=work.errds4
|
||||
,outmod=work.mod4
|
||||
,outadd=work.add4
|
||||
,outdel=work.del4
|
||||
)
|
||||
%mp_assertdsobs(work.errds4,
|
||||
desc=Add4 - 5 errs,
|
||||
test=EQUALS 5
|
||||
)
|
||||
%mp_assertdsobs(work.add4,
|
||||
desc=Add4 - records populated,
|
||||
test=EQUALS 5
|
||||
)
|
||||
|
||||
/**
|
||||
* Additions test - where base table has missing vars
|
||||
*/
|
||||
data work.orig5;
|
||||
set work.orig;
|
||||
drop Coal;
|
||||
run;
|
||||
data work.final5;
|
||||
set work.final;
|
||||
where move_type='A';
|
||||
run;
|
||||
%mp_stackdiffs(work.orig5
|
||||
,work.final5
|
||||
,CUSTOMER YEAR
|
||||
,mdebug=1
|
||||
,errds=work.errds5
|
||||
,outmod=work.mod5
|
||||
,outadd=work.add5
|
||||
,outdel=work.del5
|
||||
)
|
||||
%mp_assertdsobs(work.errds5,
|
||||
desc=Add5 - 10 errs,
|
||||
test=EQUALS 10
|
||||
)
|
||||
%mp_assertdsobs(work.add5,
|
||||
desc=Add5 - 0 records populated due to structure change,
|
||||
test=EQUALS 0
|
||||
)
|
||||
|
||||
/**
|
||||
* Additions test - where append table has missing vars
|
||||
*/
|
||||
data work.final6;
|
||||
set work.final;
|
||||
where tgtvar_nm ne 'COAL' and move_type='A';
|
||||
run;
|
||||
%mp_stackdiffs(work.orig
|
||||
,work.final6
|
||||
,CUSTOMER YEAR
|
||||
,mdebug=1
|
||||
,errds=work.errds6
|
||||
,outmod=work.mod6
|
||||
,outadd=work.add6
|
||||
,outdel=work.del6
|
||||
)
|
||||
%mp_assertdsobs(work.errds6,
|
||||
desc=Add6 - 0 errs,
|
||||
test=EQUALS 0
|
||||
)
|
||||
%mp_assertdsobs(work.add6,
|
||||
desc=Add6 - 10 records populated (structure change irrelevant),
|
||||
test=EQUALS 10
|
||||
)
|
||||
|
||||
/**
|
||||
* Modifications test - where base table has missing vars
|
||||
*/
|
||||
data work.orig7;
|
||||
set work.orig;
|
||||
drop Coal;
|
||||
run;
|
||||
data work.final7;
|
||||
set work.final;
|
||||
where move_type='M';
|
||||
run;
|
||||
%mp_stackdiffs(work.orig7
|
||||
,work.final7
|
||||
,CUSTOMER YEAR
|
||||
,mdebug=1
|
||||
,errds=work.errds7
|
||||
,outmod=work.mod7
|
||||
,outadd=work.add7
|
||||
,outdel=work.del7
|
||||
)
|
||||
%mp_assertdsobs(work.errds7,
|
||||
desc=Mod7 - 10 errs,
|
||||
test=EQUALS 10
|
||||
)
|
||||
%mp_assertdsobs(work.Mod7,
|
||||
desc=Mod7 - 0 records populated (structure change relevant),
|
||||
test=EQUALS 0
|
||||
)
|
||||
%mp_assertdsobs(work.add7,
|
||||
desc=add7 - 0 records populated ,
|
||||
test=EQUALS 0
|
||||
)
|
||||
%mp_assertdsobs(work.del7,
|
||||
desc=del7 - 0 records populated ,
|
||||
test=EQUALS 0
|
||||
)
|
||||
/**
|
||||
* Modifications (big) test - where base table has missing rows
|
||||
* Also used as a full integration test (all move_types)
|
||||
* And a test if the actual values were applied
|
||||
*/
|
||||
data work.orig8;
|
||||
set sashelp.electric;
|
||||
if _n_ le 16;
|
||||
run;
|
||||
%mp_stackdiffs(work.orig8
|
||||
,work.final
|
||||
,CUSTOMER YEAR
|
||||
,mdebug=1
|
||||
,errds=work.errds8
|
||||
,outmod=work.mod8
|
||||
,outadd=work.add8
|
||||
,outdel=work.del8
|
||||
)
|
||||
%mp_assertdsobs(work.errds8,
|
||||
desc=Mod4 - 4 errs,
|
||||
test=EQUALS 4
|
||||
)
|
||||
%mp_assertdsobs(work.Mod8,
|
||||
desc=Mod8 - 6 records populated (missing rows relevant),
|
||||
test=EQUALS 6
|
||||
)
|
||||
|
||||
/**
|
||||
* Modifications test - were diffs actually applied?
|
||||
*/
|
||||
data work.checkds;
|
||||
charchk='modified';
|
||||
numchk=-1;
|
||||
output;
|
||||
run;
|
||||
%mp_assertcolvals(work.mod8.coal,
|
||||
checkvals=work.checkds.numchk,
|
||||
desc=Modified numeric value matches,
|
||||
test=ALLVALS
|
||||
)
|
||||
%mp_assertcolvals(work.mod8.coaltip,
|
||||
checkvals=work.checkds.charchk,
|
||||
desc=Modified char value matches,
|
||||
test=ALLVALS
|
||||
)
|
||||
|
||||
|
||||
%mp_assertscope(COMPARE,ignorelist=SASJS_FUNCTIONS)
|
||||
102
tests/base/mp_storediffs.test.sas
Normal file
102
tests/base/mp_storediffs.test.sas
Normal file
@@ -0,0 +1,102 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_storediffs macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_storediffs.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertcolvals.sas
|
||||
@li mp_assertdsobs.sas
|
||||
|
||||
**/
|
||||
|
||||
/* make some data */
|
||||
|
||||
data work.orig work.deleted work.changed work.appended;
|
||||
set sashelp.class;
|
||||
if _n_=1 then do;
|
||||
output work.orig work.deleted;
|
||||
end;
|
||||
else if _n_=2 then do;
|
||||
output work.orig;
|
||||
age=99;
|
||||
output work.changed;
|
||||
end;
|
||||
else do;
|
||||
name='Newbie';
|
||||
output work.appended;
|
||||
stop;
|
||||
end;
|
||||
run;
|
||||
|
||||
%mp_storediffs(sashelp.class,work.orig,NAME
|
||||
,delds=work.deleted
|
||||
,modds=work.changed
|
||||
,appds=work.appended
|
||||
,outds=work.final
|
||||
,mdebug=1
|
||||
)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
%str(&syscc)=%str(0)
|
||||
),
|
||||
desc=ensure no errors,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assertdsobs(work.final,
|
||||
desc=Has 15 records,
|
||||
test=EQUALS 15,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
data work.check;
|
||||
length val $10;
|
||||
do val='C','N';
|
||||
output;
|
||||
end;
|
||||
run;
|
||||
%mp_assertcolvals(work.final.tgtvar_type,
|
||||
checkvals=work.check.val,
|
||||
desc=All values have a match,
|
||||
test=ALLVALS
|
||||
)
|
||||
|
||||
/* Test for when there are no actual changes */
|
||||
data work.orig work.deleted work.changed work.appended;
|
||||
set sashelp.class;
|
||||
output work.orig;
|
||||
run;
|
||||
%mp_storediffs(sashelp.class,work.orig,NAME
|
||||
,delds=work.deleted
|
||||
,modds=work.changed
|
||||
,appds=work.appended
|
||||
,outds=work.final2
|
||||
,mdebug=1
|
||||
)
|
||||
%mp_assertdsobs(work.final2,
|
||||
desc=No changes produces 0 records,
|
||||
test=EQUALS 0,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* Test for deletes only */
|
||||
data work.orig work.deleted work.changed work.appended;
|
||||
set sashelp.class;
|
||||
output work.orig;
|
||||
if _n_>5 then output work.deleted;
|
||||
run;
|
||||
|
||||
%mp_storediffs(sashelp.class,work.orig,NAME
|
||||
,delds=work.deleted
|
||||
,modds=work.changed
|
||||
,appds=work.appended
|
||||
,outds=work.final3
|
||||
,mdebug=1
|
||||
)
|
||||
%mp_assertdsobs(work.final3,
|
||||
desc=Delete has 70 records,
|
||||
test=EQUALS 70,
|
||||
outds=work.test_results
|
||||
)
|
||||
28
tests/base/mp_streamfile.test.sas
Normal file
28
tests/base/mp_streamfile.test.sas
Normal file
@@ -0,0 +1,28 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_streamfile.sas macro
|
||||
@details This is tricky to test as it streams to webout. For now just
|
||||
check the compilation, and for macro leakage.
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_assert.sas
|
||||
@li mp_assertscope.sas
|
||||
@li mp_streamfile.sas
|
||||
|
||||
**/
|
||||
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
|
||||
%mp_streamfile(iftrue=(1=0)
|
||||
,contenttype=csv,inloc=/some/where.txt
|
||||
,outname=myfile.txt
|
||||
)
|
||||
|
||||
%mp_assertscope(COMPARE)
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&syscc=0),
|
||||
desc=Checking error condition,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
132
tests/base/mp_validatecol.test.sas
Normal file
132
tests/base/mp_validatecol.test.sas
Normal file
@@ -0,0 +1,132 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_validatecol.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_assertdsobs.sas
|
||||
@li mp_validatecol.sas
|
||||
|
||||
**/
|
||||
|
||||
|
||||
/**
|
||||
* Test 1 - LIBDS
|
||||
*/
|
||||
data test1;
|
||||
infile datalines4 dsd;
|
||||
input;
|
||||
libds=_infile_;
|
||||
%mp_validatecol(libds,LIBDS,is_libds)
|
||||
if is_libds=1;
|
||||
datalines4;
|
||||
some.libname
|
||||
!lib.blah
|
||||
%abort
|
||||
definite.ok
|
||||
not.ok!
|
||||
nineletrs._
|
||||
;;;;
|
||||
run;
|
||||
%mp_assertdsobs(work.test1,
|
||||
desc=Testing LIBDS,
|
||||
test=EQUALS 2,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/**
|
||||
* Test 2 - ISNUM
|
||||
*/
|
||||
data test2;
|
||||
infile datalines4 dsd;
|
||||
input;
|
||||
infile=_infile_;
|
||||
%mp_validatecol(infile,ISNUM,is_numeric)
|
||||
if is_numeric=1;
|
||||
datalines4;
|
||||
1
|
||||
0001
|
||||
1e6
|
||||
-44
|
||||
above are good
|
||||
the rest are bad
|
||||
%abort
|
||||
1&somethingverybad.
|
||||
&
|
||||
+-1
|
||||
;;;;
|
||||
run;
|
||||
%mp_assertdsobs(work.test2,
|
||||
desc=Test2 - ISNUM,
|
||||
test=EQUALS 4,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/**
|
||||
* Test 3 - FORMAT
|
||||
*/
|
||||
data test3;
|
||||
infile datalines4 dsd;
|
||||
input;
|
||||
infile=_infile_;
|
||||
%mp_validatecol(infile,FORMAT,is_format)
|
||||
if is_format=1;
|
||||
datalines4;
|
||||
$.
|
||||
$format.
|
||||
$format12.2
|
||||
somenum.
|
||||
somenum12.4
|
||||
above are good
|
||||
the rest are bad
|
||||
%abort
|
||||
1&somethingverybad.
|
||||
&
|
||||
+-1
|
||||
.
|
||||
a.A
|
||||
$format12.1b
|
||||
$format12.1b1
|
||||
;;;;
|
||||
run;
|
||||
%mp_assertdsobs(work.test3,
|
||||
desc=Test3 - ISFORMAT,
|
||||
test=EQUALS 5,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/**
|
||||
* Test 4 - ISINT
|
||||
*/
|
||||
data test4;
|
||||
infile datalines4 dsd;
|
||||
input;
|
||||
infile=_infile_;
|
||||
%mp_validatecol(infile,ISINT,is_integer)
|
||||
if is_integer=1;
|
||||
datalines4;
|
||||
1
|
||||
1234
|
||||
-134
|
||||
-1.0
|
||||
1.0
|
||||
0
|
||||
above are good
|
||||
the rest are bad
|
||||
0.1
|
||||
1.1
|
||||
-0.001
|
||||
%abort
|
||||
1&somethingverybad.
|
||||
&
|
||||
+-1
|
||||
.
|
||||
a.A
|
||||
$format12.1b
|
||||
$format12.1b1
|
||||
;;;;
|
||||
run;
|
||||
%mp_assertdsobs(work.test4,
|
||||
desc=Test4 - ISFORMAT,
|
||||
test=EQUALS 6,
|
||||
outds=work.test_results
|
||||
)
|
||||
39
tests/base/mp_webin.test.sas
Normal file
39
tests/base/mp_webin.test.sas
Normal file
@@ -0,0 +1,39 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_webin macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_webin.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
/* force SAS9 tests as we don't have a valid URI available */
|
||||
%macro mf_getplatform();
|
||||
SAS9
|
||||
%mend mf_getplatform;
|
||||
|
||||
/* TEST 1 */
|
||||
%let _webin_file_count=1;
|
||||
%let _webin_filename=test;
|
||||
%mp_webin()
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
%symexist(_WEBIN_FILEREF1)
|
||||
),
|
||||
desc=Checking if the macvar exists,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* TEST 2 */
|
||||
%global _WEBIN_FILENAME1;
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
%str(&_WEBIN_FILENAME1)=%str(test)
|
||||
),
|
||||
desc=Checking if the macvar exists,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
|
||||
115
tests/base/mp_zip.test.sas
Normal file
115
tests/base/mp_zip.test.sas
Normal file
@@ -0,0 +1,115 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_zip macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_mkdir.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_zip.sas
|
||||
@li mp_unzip.sas
|
||||
|
||||
**/
|
||||
|
||||
%let work=%sysfunc(pathname(work));
|
||||
%let root=&work/zipme;
|
||||
|
||||
/* TEST 1 - zip a file */
|
||||
%mf_mkdir(&root)
|
||||
|
||||
data _null_;
|
||||
file "&root/test.txt";
|
||||
put "houston, this is a test";
|
||||
run;
|
||||
|
||||
%mp_zip(in=&root/test.txt
|
||||
,type=FILE
|
||||
,outpath=&work
|
||||
,outname=myFile
|
||||
)
|
||||
|
||||
%mp_unzip(ziploc="&work/myFile.zip",outdir=&work)
|
||||
|
||||
data _null_;
|
||||
infile "&work/test.txt";
|
||||
input;
|
||||
call symputx('content1',_infile_);
|
||||
putlog _infile_;
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
%str(&content1)=%str(houston, this is a test)
|
||||
),
|
||||
desc=Checking if file zip / unzip works,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* TEST 2 - zip a dataset of files */
|
||||
data _null_;
|
||||
file "&root/test2.txt";
|
||||
put "houston, this is test2";
|
||||
run;
|
||||
libname tmp "&root";
|
||||
data tmp.test;
|
||||
filepath="&root/test2.txt";
|
||||
run;
|
||||
|
||||
%mp_zip(in=tmp.test
|
||||
,incol=filepath
|
||||
,type=DATASET
|
||||
,outpath=&work
|
||||
,outname=myFile2
|
||||
)
|
||||
|
||||
%mp_unzip(ziploc="&work/myFile2.zip",outdir=&work)
|
||||
|
||||
data _null_;
|
||||
infile "&work/test2.txt";
|
||||
input;
|
||||
call symputx('content2',_infile_);
|
||||
putlog _infile_;
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
%str(&content2)=%str(houston, this is test2)
|
||||
),
|
||||
desc=Checking if file zip / unzip from a dataset works,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/* TEST 3 - zip a dataset of files */
|
||||
%mf_mkdir(&work/out3)
|
||||
|
||||
%mp_zip(in=&root
|
||||
,type=DIRECTORY
|
||||
,outpath=&work
|
||||
,outname=myFile3
|
||||
)
|
||||
|
||||
%mp_unzip(ziploc="&work/myFile3.zip",outdir=&work/out3)
|
||||
|
||||
data _null_;
|
||||
infile "&work/out3/test.txt";
|
||||
input;
|
||||
call symputx('content3a',_infile_);
|
||||
putlog _infile_;
|
||||
run;
|
||||
data _null_;
|
||||
infile "&work/out3/test2.txt";
|
||||
input;
|
||||
call symputx('content3b',_infile_);
|
||||
putlog _infile_;
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(
|
||||
%str(&content3a)=%str(houston, this is a test)
|
||||
and
|
||||
%str(&content3b)=%str(houston, this is test2)
|
||||
),
|
||||
desc=Checking if file zip / unzip from a directory works,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user