65 %MACRO assertColumns (
 
   70    ,i_allow        = DSLABEL LABEL COMPVAR
 
   97 %LOCAL l_i l_j l_symboli l_symbolj l_potenz l_mask; 
 
  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( )));
 
  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;
 
  111    %PUT &g_error: assertColumns: invalid symbol &l_symboli in parameter i_allow;
 
  114    %LET l_mask = %sysfunc(bor(&l_mask, &l_potenz));
 
  118 %IF %length(&i_maxReportObs) %then %LET o_maxReportObs = &i_maxReportObs;
 
  121 %GLOBAL g_inTestcase;
 
  122 %IF &g_inTestcase EQ 1 %THEN %DO;
 
  125 %ELSE %IF &g_inTestcase NE 2 %THEN %DO;
 
  126    %PUT &g_error: assert can only be called after initTestcase;
 
  131 %LOCAL l_casid l_tstid;
 
  133     i_type     = assertColumns
 
  134    ,i_expected = %upcase(&i_allow)
 
  143 %LOCAL l_rc l_actual; 
 
  144 %IF NOT %sysfunc(exist(&i_actual,DATA)) AND NOT %sysfunc(exist(&i_actual,VIEW)) %THEN %DO;
 
  146    %LET l_actual=ERROR: actual table not found.;
 
  150 %ELSE %IF NOT %sysfunc(exist(&i_expected,DATA)) AND NOT %sysfunc(exist(&i_expected,VIEW))%THEN %DO;
 
  152    %LET l_actual=&l_actual ERROR: expected table not found.;
 
  158    %LOCAL l_formchar l_compResult;
 
  159    %LET l_formchar=%sysfunc(getoption(formchar));
 
  160    OPTIONS FORMCHAR="|----|+|---+=|-/\<>*";
 
  162    ODS DOCUMENT NAME=testout._%substr(00&g_scnid,%length(&g_scnid))_&l_casid._&l_tstid._columns_rep(WRITE);
 
  168       %IF %quote(&i_fuzz) NE %THEN CRITERION=&i_fuzz METHOD=ABSOLUTE;
 
  170       %IF %quote(&i_id) NE %THEN %str(ID &i_id;);
 
  172    %PUT sysinfo = &sysinfo;
 
  173    %LET l_compResult = &sysinfo;
 
  176    OPTIONS FORMCHAR="&l_formchar";
 
  179    %LET l_rc=%eval(%sysfunc(bxor(%sysfunc(bor(&l_mask,&l_compResult)),&l_mask)) NE 0);
 
  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;
 
  190       %LET l_potenz = &l_potenz*2;
 
  200          ,tst_act = "&l_actual"
 
  202          tst_scnid = &g_scnid AND
 
  203          tst_casid = &l_casid AND
 
  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.);
 
  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.);