Macros for SAS Application Developers
https://github.com/sasjs/core
mp_filtercheck.test.sas
Go to the documentation of this file.
1 /**
2  @file
3  @brief Testing mp_filtercheck macro
4 
5  <h4> SAS Macros </h4>
6  @li mp_filtercheck.sas
7  @li mp_assertdsobs.sas
8  @li mp_assert.sas
9  @li mp_assertscope.sas
10 
11 **/
12 
13 /* set up test data */
14 data work.class ;
15 length name $8 sex $1 age height weight 8;
16 infile cards dsd;
17 input Name:$char. Sex :$char. Age Height Weight;
18 datalines4;
19 Alfred,M,14,69,112.5
20 Alice,F,13,56.5,84
21 Barbara,F,13,65.3,98
22 Carol,F,14,62.8,102.5
23 Henry,M,14,63.5,102.5
24 James,M,12,57.3,83
25 Jane,F,12,59.8,84.5
26 Janet,F,15,62.5,112.5
27 Jeffrey,M,13,62.5,84
28 John,M,12,59,99.5
29 Joyce,F,11,51.3,50.5
30 Judy,F,14,64.3,90
31 Louise,F,12,56.3,77
32 Mary,F,15,66.5,112
33 Philip,M,16,72,150
34 Robert,M,12,64.8,128
35 Ronald,M,15,67,133
36 Thomas,M,11,57.5,85
37 William,M,15,66.5,112
38 ;;;;
39 run;
40 
41 /* VALID filter conditions */
42 data work.inds;
43  infile datalines4 dsd;
44  input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
45  OPERATOR_NM:$10. RAW_VALUE:$4000.;
46 datalines4;
47 AND,AND,1,AGE,=,12
48 AND,AND,1,SEX,<=,"'M'"
49 AND,OR,2,Name,NOT IN,"('Jane','Alfred')"
50 AND,OR,2,Weight,>=,77.7
51 AND,OR,2,Weight,NE,77.7
52 AND,AND,1,age,=,.A
53 AND,AND,1,height,<,.B
54 AND,AND,1,age,IN,"(.a,.b,.)"
55 AND,AND,1,age,IN,"(.A)"
56 
57 ;;;;
58 run;
59 
60 %mp_assertscope(SNAPSHOT)
61 %mp_filtercheck(work.inds,
62  targetds=work.class,
63  outds=work.badrecords,
64  abort=NO
65 )
66 %mp_assertscope(COMPARE)
67 
68 %let syscc=0;
69 %mp_assertdsobs(work.badrecords,
70  desc=Valid filter query,
71  test=EMPTY,
72  outds=work.test_results
73 )
74 
75 /* invalid column */
76 data work.inds;
77  infile datalines4 dsd;
78  input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
79  OPERATOR_NM:$10. RAW_VALUE:$4000.;
80 datalines4;
81 AND,AND,1,invalid,=,12
82 AND,AND,1,SEX,<=,"'M'"
83 AND,OR,2,Name,NOT IN,"('Jane','Alfred')"
84 AND,OR,2,Weight,>=,7
85 ;;;;
86 run;
87 %mp_filtercheck(work.inds,
88  targetds=work.class,
89  outds=work.badrecords,
90  abort=NO
91 )
92 %let syscc=0;
93 %mp_assertdsobs(work.badrecords,
94  desc=Invalid column name,
95  test=HASOBS,
96  outds=work.test_results
97 )
98 
99 /* invalid raw value */
100 data work.inds;
101  infile datalines4 dsd;
102  input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
103  OPERATOR_NM:$10. RAW_VALUE:$4000.;
104 datalines4;
105 AND,OR,2,Name,NOT IN,"(''''Jane','Alfred')"
106 ;;;;
107 run;
108 
109 %mp_filtercheck(work.inds,
110  targetds=work.class,
111  outds=work.badrecords,
112  abort=NO
113 )
114 %let syscc=0;
115 %mp_assertdsobs(work.badrecords,
116  desc=Invalid raw value,
117  test=HASOBS,
118  outds=work.test_results
119 )
120 
121 /* invalid IN value */
122 data work.inds;
123  infile datalines4 dsd;
124  input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
125  OPERATOR_NM:$10. RAW_VALUE:$4000.;
126 datalines4;
127 AND,OR,2,age,IN,"(.,.a,X)"
128 ;;;;
129 run;
130 
131 %mp_filtercheck(work.inds,
132  targetds=work.class,
133  outds=work.badrecords,
134  abort=NO
135 )
136 %let syscc=0;
137 %mp_assertdsobs(work.badrecords,
138  desc=Invalid IN value,
139  test=HASOBS,
140  outds=work.test_results
141 )
142 
143 /* Code injection - column name */
144 data work.inds;
145  infile datalines4 dsd;
146  input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
147  OPERATOR_NM:$10. RAW_VALUE:$4000.;
148 datalines4;
149 AND,AND,1,%abort,=,12
150 AND,OR,2,Weight,>=,7
151 ;;;;
152 run;
153 
154 %mp_filtercheck(work.inds,
155  targetds=work.class,
156  outds=work.badrecords,
157  abort=NO
158 )
159 %let syscc=0;
160 %mp_assertdsobs(work.badrecords,
161  desc=Code injection - column name,
162  test=HASOBS,
163  outds=work.test_results
164 )
165 
166 /* Code injection - raw values*/
167 data work.inds;
168  infile datalines4 dsd;
169  input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
170  OPERATOR_NM:$10. RAW_VALUE:$4000.;
171 datalines4;
172 AND,AND,1,age,=,;;%abort
173 ;;;;
174 run;
175 %mp_filtercheck(work.inds,
176  targetds=work.class,
177  outds=work.badrecords,
178  abort=NO
179 )
180 %let syscc=0;
181 %mp_assertdsobs(work.badrecords,
182  desc=Code injection - raw value abort,
183  test=HASOBS,
184  outds=work.test_results
185 )
186 
187 /* Supply variables with incorrect types */
188 data work.inds;
189  infile datalines4 dsd;
190  input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
191  OPERATOR_NM:$10. RAW_VALUE:8.;
192 datalines4;
193 AND,AND,1,age,=,0
194 ;;;;
195 run;
196 %let syscc=0;
197 %mp_filtercheck(work.inds,
198  targetds=work.class,
199  outds=work.badrecords,
200  abort=NO
201 )
202 %mp_assert(iftrue=(&syscc=42),
203  desc=Throw error if RAW_VALUE is incorrect,
204  outds=work.test_results
205 )
206 %let syscc=0;