40 %MACRO runSASUnit(i_source =
73 %LET l_macname=&sysmacroname;
75 %_tempFileName(d_dir);
76 %_tempFileName(d_examinee);
79 %IF %_handleError(&l_macname.
81 ,NOT %sysfunc(exist(target.tsu)) OR NOT %symexist(g_project)
82 ,%nrstr(test database cannot be accessed, call %initSASUnit before %runSASUnit)
83 ,i_verbose=&g_verbose.
88 %IF
"&i_recursive" NE
"1" %THEN %LET i_recursive=0;
91 %LET l_source = %_abspath(&g_root, &i_source);
92 %_dir(i_path=&l_source, i_recursive=&i_recursive, o_out=&d_dir)
93 %IF %_handleError(&l_macname.
96 ,Error in parameter i_source: no test scenarios found
97 ,i_verbose=&g_verbose.
101 %DO i=1 %TO %_nobs(&d_dir);
110 CALL symput (
'l_scnfile' !! left(put(_n_,8.)), trim(filename));
111 CALL symput (
'l_scnchanged' !! left(put(_n_,8.)), compress(put(changed,12.)));
112 CALL symput (
'l_nscn', compress(put(_n_,8.)));
116 %LET l_auto=&g_sasautos;
118 %DO %WHILE(
"&l_auto" ne
"");
119 %LET l_auto=%quote(&l_auto/);
120 %_dir(i_path=&l_auto.*.sas, o_out=&d_dir)
122 set %IF &l_autonr>0 %THEN &d_examinee; &d_dir(in=indir);
123 if indir then auton=&l_autonr.+2;
125 %LET l_autonr = %eval(&l_autonr+1);
127 %IF %symexist(g_sasautos&l_autonr) %THEN %LET l_auto=&&g_sasautos&l_autonr;
129 %LET l_auto=&g_sasunit;
130 %LET l_auto=%quote(&l_auto/);
131 %_dir(i_path=&l_auto.*.sas, o_out=&d_dir)
133 set &d_examinee &d_dir(in=indir);
134 if indir then auton=0;
136 %LET l_auto=&g_sasunit_os;
137 %LET l_auto=%quote(&l_auto/);
138 %_dir(i_path=&l_auto.*.sas, o_out=&d_dir)
140 set &d_examinee &d_dir(in=indir);
141 if indir then auton=1;
147 %LET l_scn = %_stdPath(&g_root, &&l_scnfile&i);
151 i_scnfile = &&l_scnfile&i
152 ,i_changed = &&l_scnchanged&i
159 %IF &l_scnid = 0 %THEN %DO;
161 SELECT max(scn_id) INTO :l_scnid FROM target.scn;
162 %IF &l_scnid=. %THEN %LET l_scnid=0;
163 %LET l_scnid = %eval(&l_scnid+1);
164 INSERT INTO target.scn VALUES (
172 %ELSE %IF &l_dorun %THEN %DO;
174 %_deletescenariofiles(i_scnid=&l_scnid.);
177 DELETE FROM target.cas WHERE cas_scnid = &l_scnid;
178 DELETE FROM target.tst WHERE tst_scnid = &l_scnid;
184 %IF &l_dorun %THEN %DO;
185 %PUT ======== test scenario &l_scnid (&l_scn) will be run ========;
190 %PUT ======== test scenario &l_scnid (&l_scn) will not be run ==;
196 %IF &l_dorun %THEN %DO;
199 %_getPgmDesc (i_pgmfile=&&l_scnfile&i, r_desc=l_scndesc)
201 UPDATE target.scn SET
202 scn_desc = "&l_scndesc"
203 ,scn_start = %sysfunc(datetime())
204 WHERE scn_id = &l_scnid
208 %LET l_c_scnid = %substr(00&l_scnid.,%length(&l_scnid));
209 %LET l_scnlogfullpath = &g_log/&l_c_scnid..log;
210 %_runProgramSpawned(i_program =&&l_scnfile&i
211 ,i_scnid =&l_c_scnid.
212 ,i_generateMcoverage=&g_testcoverage.
218 %LET l_lstfile=&g_testout/%substr(00&l_scnid,%length(&l_scnid)).lst;
219 %IF %SYSFUNC(FILEEXIST("&l_lstfile")) %THEN %DO;
223 CALL symput ('l_filled','1');
227 %IF NOT &l_filled %THEN %DO;
228 %LET l_filled=%_delfile(&l_lstfile);
234 i_logfile = &l_scnlogfullpath.
236 ,i_warning = &g_warning.
237 ,r_errors = l_error_count
238 ,r_warnings= l_warning_count
243 %*** Treat missing scenario as error ***;
246 SELECT max (cas_res) INTO :l_result FROM target.cas WHERE cas_scnid=&l_scnid;
248 %*** Treat missing scenario as failed and treat scenario wit errors in scenario log as failed ***;
249 %if (&l_result. = . or &l_error_count. > 0) %then %let l_result=2;
253 scn_end = %sysfunc(datetime())
255 ,scn_errorcount = &l_error_count.
256 ,scn_warningcount = &l_warning_count.
257 ,scn_res = &l_result.
269 %PUT =========================== Error! runSASUnit aborted! ==========================================;
273 %IF %EVAL("%UPCASE(&g_error_code.)" EQ "%UPCASE(NoSourceFiles)") %THEN %DO;
277 %LET l_scn = %_stdPath(&g_root., &l_source.);
279 %LET l_nscncount = 0;
282 INTO :l_nscncount SEPARATED BY ''
284 WHERE Upcase(scn_path) = "%UPCASE(&l_scn.)";
287 %IF %EVAL(&l_nscncount. EQ 0) %THEN %DO;
289 %LET l_scndesc = %STR(Scenario not found - has to fail!);
292 SELECT max(scn_id) INTO :l_scnid FROM target.scn;
293 %IF &l_scnid=. %THEN %LET l_scnid=0;
294 %LET l_scnid = %eval(&l_scnid+1);
295 INSERT INTO target.scn
327 PROC DATASETS NOLIST NOWARN LIB=%scan(&d_dir,1,.);
328 DELETE %scan(&d_dir,2,.);
329 DELETE %scan(&d_examinee,2,.);