SASUnit Examples  Version 1.2
assertcolumns.sas
Go to the documentation of this file.
1 
56 /* change history
57  29.01.2013 KL changed link from _sasunit_doc.sas to Sourceforge SASUnit User's Guide
58  01.07.2008 AM umfangreiche Überarbeitung:
59  i_allow eingeführt, um erlaubte Unterschiede steuern zu können,
60  i_maxReportObs durch o_maxReportObs ersetzt
61  o_copydata eliminiert (Semantik o_copydata=0 durch o_maxReportObs=0 erreicht)
62  METHOD=ABSOLUTE eingesetzt, wenn i_fuzz gesetzt
63 */
64 
65 %MACRO assertColumns (
66  i_expected =
67  ,i_actual =
68  ,i_desc =
69  ,i_fuzz =
70  ,i_allow = DSLABEL LABEL COMPVAR
71  ,i_id =
72  ,o_maxReportObs = max
73  ,i_maxReportObs = /* obsolete */
74 );
75 
76 /*-- possible values for i_allow ---------------------------------------------*/
77 %LET l_allowSymbols=
78  DSLABEL
79  DSTYPE
80  INFORMAT
81  FORMAT
82  LENGTH
83  LABEL
84  BASEOBS
85  COMPOBS
86  BASEBY
87  COMPBY
88  BASEVAR
89  COMPVAR
90  VALUE
91  TYPE
92  BYVAR
93  ERROR
94 ;
95 
96 /*-- check parameter i_allow ------------------------------------------------*/
97 %LOCAL l_i l_j l_symboli l_symbolj l_potenz l_mask;
98 %LET l_mask=0;
99 %LET l_i=0;
100 %DO %WHILE(%length(%scan(&i_allow,%eval(&l_i+1),%str( ))));
101  %LET l_i = %eval (&l_i + 1);
102  %LET l_symboli = %upcase(%scan(&i_allow, &l_i, %str( )));
103  %LET l_j=0;
104  %LET l_potenz=1;
105  %DO %WHILE(%length(%scan(&l_allowSymbols,%eval(&l_j+1),%str( ))));
106  %LET l_j = %eval (&l_j+1);
107  %LET l_symbolj = %scan(&l_allowSymbols, &l_j, %str( ));
108  %IF &l_symboli = &l_symbolj %THEN %goto label1;
109  %LET l_potenz = &l_potenz*2;
110  %END;
111  %PUT &g_error: assertColumns: invalid symbol &l_symboli in parameter i_allow;
112  %RETURN;
113 %label1:
114  %LET l_mask = %sysfunc(bor(&l_mask, &l_potenz));
115 %END;
116 
117 /*-- support obsolete parameter i_maxReportObs -------------------------------*/
118 %IF %length(&i_maxReportObs) %then %LET o_maxReportObs = &i_maxReportObs;
119 
120 /*-- verify correct sequence of calls-----------------------------------------*/
121 %GLOBAL g_inTestcase;
122 %IF &g_inTestcase EQ 1 %THEN %DO;
123  %endTestcall()
124 %END;
125 %ELSE %IF &g_inTestcase NE 2 %THEN %DO;
126  %PUT &g_error: assert can only be called after initTestcase;
127  %RETURN;
128 %END;
129 
130 /*-- get current ids for test case and test --------- ------------------------*/
131 %LOCAL l_casid l_tstid;
132 %_sasunit_asserts(
133  i_type = assertColumns
134  ,i_expected = %upcase(&i_allow)
135  ,i_actual =
136  ,i_desc = &i_desc
137  ,i_result = .
138  ,r_casid = l_casid
139  ,r_tstid = l_tstid
140 )
141 
142 /*-- check if actual dataset exists ------------------------------------------*/
143 %LOCAL l_rc l_actual;
144 %IF NOT %sysfunc(exist(&i_actual,DATA)) AND NOT %sysfunc(exist(&i_actual,VIEW)) %THEN %DO;
145  %LET l_rc=1;
146  %LET l_actual=ERROR: actual table not found.;
147 %END;
148 
149 /*-- check if expected dataset exists ----------------------------------------*/
150 %ELSE %IF NOT %sysfunc(exist(&i_expected,DATA)) AND NOT %sysfunc(exist(&i_expected,VIEW))%THEN %DO;
151  %LET l_rc=1;
152  %LET l_actual=&l_actual ERROR: expected table not found.;
153 %END;
154 
155 /*-- compare tables ----------------------------------------------------------*/
156 %ELSE %DO;
157 
158  %LOCAL l_formchar l_compResult;
159  %LET l_formchar=%sysfunc(getoption(formchar));
160  OPTIONS FORMCHAR="|----|+|---+=|-/\<>*";
161 
162  ODS DOCUMENT NAME=testout._%substr(00&g_scnid,%length(&g_scnid))_&l_casid._&l_tstid._columns_rep(WRITE);
163  TITLE;
164  FOOTNOTE;
165  PROC COMPARE
166  BASE=&i_expected
167  COMPARE=&i_actual
168  %IF %quote(&i_fuzz) NE %THEN CRITERION=&i_fuzz METHOD=ABSOLUTE;
169  ;
170  %IF %quote(&i_id) NE %THEN %str(ID &i_id;);
171  RUN;
172  %PUT sysinfo = &sysinfo;
173  %LET l_compResult = &sysinfo;
174 
175  ODS DOCUMENT CLOSE;
176  OPTIONS FORMCHAR="&l_formchar";
177 
178 /*-- check proc compare result -----------------------------------------------*/
179  %LET l_rc=%eval(%sysfunc(bxor(%sysfunc(bor(&l_mask,&l_compResult)),&l_mask)) NE 0);
180 
181 /*-- format compare result ---------------------------------------------------*/
182  %LET l_j=0;
183  %LET l_potenz=1;
184  %DO %WHILE(%length(%scan(&l_allowSymbols,%eval(&l_j+1),%str( ))));
185  %LET l_j = %eval (&l_j+1);
186  %LET l_symbolj = %scan(&l_allowSymbols, &l_j, %str( ));
187  %IF %sysfunc(band(&l_compResult, &l_potenz)) %THEN %DO;
188  %LET l_actual = &l_actual &l_symbolj;
189  %END;
190  %LET l_potenz = &l_potenz*2;
191  %END;
192 
193 %END; /* i_expected and i_actual exist */
194 
195 /*-- update comparison result in test database -------------------------------*/
196 PROC SQL NOPRINT;
197  UPDATE target.tst
198  SET
199  tst_res = &l_rc
200  ,tst_act = "&l_actual"
201  WHERE
202  tst_scnid = &g_scnid AND
203  tst_casid = &l_casid AND
204  tst_id = &l_tstid
205  ;
206 QUIT;
207 
208 /*-- write dataset sto the target area ---------------------------------------*/
209 %IF &o_maxreportobs NE 0 %THEN %DO;
210  %IF %sysfunc(exist(&i_expected,DATA)) OR %sysfunc(exist(&i_expected,VIEW)) %THEN %DO;
211  DATA testout._%substr(00&g_scnid,%length(&g_scnid))_&l_casid._&l_tstid._columns_exp;
212  SET &i_expected (obs=&o_maxReportObs.);
213  RUN;
214  %END;
215 
216  %IF %sysfunc(exist(&i_actual,DATA)) OR %sysfunc(exist(&i_actual,VIEW)) %THEN %DO;
217  DATA testout._%substr(00&g_scnid,%length(&g_scnid))_&l_casid._&l_tstid._columns_act;
218  SET &i_actual (obs=&o_maxReportObs.);
219  RUN;
220  %END;
221 %END;
222 
223 %MEND assertColumns;