SASUnit Examples  Version 1.5.0
assertprimarykey.sas
Go to the documentation of this file.
1 
29 %MACRO assertPrimaryKey (i_library = _NONE_
30  ,i_dataset = _NONE_
31  ,i_variables = _NONE_
32  ,i_desc = Check for primary key
33  ,o_maxReportObs = MAX
34  ,o_listingVars = _NONE_
35  ,o_treatMissings = VALUE
36  );
37 
38  %GLOBAL g_inTestcase;
39  %LOCAL l_result l_errMsg l_actual l_i l_variables l_name l_anz_lvars l_path l_lastVariable l_casid l_tstid l_missingWhere;
40 
41  %LET l_result = 2;
42  %LET l_errMsg =;
43 
44  /*-- verify correct sequence of calls-----------------------------------------*/
45  %IF &g_inTestcase EQ 1 %THEN %DO;
46  %endTestcall;
47  %END;
48  %ELSE %IF &g_inTestcase NE 2 %THEN %DO;
49  %PUT &g_error.(SASUNIT): assert must be called after initTestcase;
50  %RETURN;
51  %END;
52 
53  %*************************************************************;
54  %*** Check preconditions ***;
55  %*************************************************************;
56  %IF (&i_library. = _NONE_) %THEN %DO;
57  %LET l_actual = -1;
58  %LET l_errMsg =Specify a value for parameter i_library!;
59  %GOTO Update;
60  %END;
61  %IF (&i_dataset. = _NONE_) %THEN %DO;
62  %LET l_actual = -2;
63  %LET l_errMsg =Specify a value for parameter i_dataset!;
64  %GOTO Update;
65  %END;
66  %IF (&i_variables. = _NONE_) %THEN %DO;
67  %LET l_actual = -3;
68  %LET l_errMsg =Specify a value for parameter i_variables!;
69  %GOTO Update;
70  %END;
71 
72  %*** check for valid librefs und existence of data sets Master und Lookup***;
73  %IF (%SYSFUNC (libref (&i_library.)) NE 0) %THEN %DO;
74  %LET l_actual = -4;
75  %LET l_errMsg =Libref "&i_library." of data set "&i_dataset." is not valid!;
76  %GOTO Update;
77  %END;
78  %IF (%SYSFUNC(exist(&i_library..&i_dataset.)) EQ 0) %THEN %DO;
79  %LET l_actual = -5;
80  %LET l_errMsg =Data set "&i_library..&i_dataset." does not exist!;
81  %GOTO Update;
82  %END;
83 
84  %*** Is the number of variables specified for key greater Equal 1 ? ***;
85  %LET l_anzvars = 0;
86  %LET i_variables=&i_variables.;
87  %LET l_anzvars = %eval(%SYSFUNC(count(&i_variables,%str( )))+1);
88  %IF (%length(%trim(&i_variables.)) < 1 OR &l_anzvars. LT 1) %THEN %DO;
89  %LET l_actual = -6;
90  %LET l_errMsg =No variables specified to check primary key condition!;
91  %GOTO Update;
92  %END;
93 
94  %*** Check if parameter o_maxReportObs is valid ***;
95  %IF NOT (%SYSFUNC(upcase(&o_maxReportObs.)) = MAX) %THEN %DO;
96  %IF (%datatyp(&o_maxReportObs.) ~= NUMERIC) %THEN %DO;
97  %LET l_actual = -8;
98  %LET l_errMsg =%bquote(Parameter o_maxReportObs (&o_maxReportObs) must be MAX or numeric GE 0);
99  %GOTO Update;
100  %END;
101  %ELSE %IF (&o_maxReportObs. < 0) %THEN %DO;
102  %LET l_actual = -9;
103  %LET l_errMsg =%bquote(Parameter o_maxReportObs(&o_maxReportObs) must be GE 0);
104  %GOTO Update;
105  %END;
106  %END;
107 
108  %*** Is the number of variables specified for key greater Equal 1 ? ***;
109  %LET l_anz_lvars = 0;
110  %LET o_listingVars=&o_listingVars.;
111  %IF (&o_listingVars. ne _NONE_) %THEN %DO;
112  %LET l_anz_lvars = %eval(%SYSFUNC(count(&o_listingVars,%str( )))+1);
113  %IF (%length(%trim(&o_listingVars.)) < 1 OR &l_anz_lvars. LT 1) %THEN %DO;
114  %LET l_actual = -10;
115  %LET l_errMsg =No variables specified for printing the dataset!;
116  %GOTO Update;
117  %END;
118  %END;
119 
120  %IF (%UPCASE(&o_treatMissings.) NE IGNORE
121  AND %UPCASE(&o_treatMissings.) NE DISALLOW
122  AND %UPCASE(&o_treatMissings.) NE VALUE) %THEN %DO;
123  %LET l_actual = -12;
124  %LET l_errMsg =Parameter o_treatMissings must be IGNORE%str(,) DISALLOW or VALUE!;
125  %GOTO Update;
126  %END;
127 
128  %*** Check existence of specified keys in their respective tables ***;
129  %*** Get variables in source dataset ***;
130  PROC CONTENTS data=&i_library..&i_dataset. out=work._Variables NOPRINT;
131  RUN;
132  QUIT;
133 
134  %LET l_variables =;
135  %LET l_missingWhere =;
136  %DO l_i=1 %TO &l_anzvars.;
137  %LET l_name = %scan (&i_variables., &l_i.);
138  %LET l_variables = &l_variables. "%upcase(&l_name.)";
139  %IF (&l_i. > 1) %THEN %DO;
140  %LET l_missingWhere = &l_missingWhere. AND;
141  %END;
142  %LET l_missingWhere = &l_missingWhere. not missing (&l_name.);
143  %END;
144  %LET l_lastVariable=&l_name.;
145 
146  PROC SQL NOPRINT;
147  select count (*) into :l_anzahlObs from work._Variables where upcase(name) in (&l_variables.);
148  QUIT;
149 
150  %IF (&l_anzvars. ne &l_anzahlObs.) %THEN %DO;
151  %LET l_actual = -7;
152  %LET l_errMsg =Parameter i_variables contains invalid column names!;
153  %GOTO Update;
154  %END;
155 
156  %IF (&o_listingVars. ne _NONE_) %THEN %DO;
157  %LET l_variables =;
158  %DO l_i=1 %TO &l_anz_lvars.;
159  %LET l_name = %scan (&o_listingVars., &l_i.);
160  %LET l_variables = &l_variables. "%upcase(&l_name.)";
161  %END;
162  PROC SQL NOPRINT;
163  select count (*) into :l_anzahlObs from work._Variables where upcase(name) in (&l_variables.);
164  QUIT;
165  %IF (&l_anz_lvars. ne &l_anzahlObs.) %THEN %DO;
166  %LET l_actual = -11;
167  %LET l_errMsg =Parameter o_listingVars contains invalid column names!;
168  %GOTO Update;
169  %END;
170  %END;
171 
172  %IF (%upcase(&o_treatMissings.) eq DISALLOW) %THEN %DO;
173  PROC SQL NOPRINT;
174  select count (*) into :l_anzahlObs from &i_library..&i_dataset. where not (&l_missingWhere.);
175  QUIT;
176  %IF (&l_anzahlObs. > 0) %THEN %DO;
177  %LET l_actual = -13;
178  %LET l_errMsg =Parameter o_treatMissings is set to disallow but dataset contains missing values!;
179  %GOTO Update;
180  %END;
181  %END;
182  %*-- get current ids for test case and test ---------------------------------*;
183  %_getScenarioTestId (i_scnid=&g_scnid, r_casid=l_casid, r_tstid=l_tstid);
184 
185  %*** create subfolder ***;
186  %_createTestSubfolder (i_assertType =assertPrimaryKey
187  ,i_scnid =&g_scnid.
188  ,i_casid =&l_casid.
189  ,i_tstid =&l_tstid.
190  ,r_path =l_path
191  );
192 
193  libname _apk "&l_path.";
194 
195  %* sort dataset by i_variables *;
196  proc sort data=&i_library..&i_dataset. out=work._sorted;
197  by &i_variables;
198  %IF (%upcase(&o_treatMissings.) = IGNORE) %THEN %DO;
199  where &l_missingWhere.;
200  %END;
201  run;
202 
203  data work._notUnique;
204  set work._sorted;
205  by &i_variables;
206  if not (first.&l_lastVariable. AND last.&l_lastVariable.);
207  run;
208 
209  PROC SQL NOPRINT;
210  select count (*) into :l_anzahlObs from work._notUnique;
211  QUIT;
212 
213  data _apk._sorted;
214  set work._sorted (OBS=&o_maxReportObs.);
215  %IF (&o_listingVars. ne _NONE_) %THEN %DO;
216  keep &o_listingVars.;
217  %END;
218  run;
219 
220  data _apk._notUnique;
221  set work._notUnique (OBS=&o_maxReportObs.);
222  %IF (&o_listingVars. ne _NONE_) %THEN %DO;
223  keep &o_listingVars.;
224  %END;
225  run;
226 
227  %LET l_actual=%eval(&l_anzahlObs. = 0);
228  %LET l_result=%eval((&l_anzahlObs. > 0)*2);
229 
230  %Update:
231  %_asserts(i_type = assertPrimaryKey
232  ,i_expected = 1
233  ,i_actual = %str(&l_actual.)
234  ,i_desc = &i_desc.
235  ,i_result = &l_result.
236  ,i_errMsg = &l_errMsg.
237  )
238 %MEND assertPrimaryKey;