We can use the tag as a unique key for the test results data set so that the data set has the most recent test result for each and every test. We can re-run individual tests and have an individual row in the results data set updated.
To give us the greatest flexibility to add more macros to our test suite, we don't want the process of writing results to a data set to interfere with activities that are external to the macro. So, using a SET statement, for example, would require the data set to be named in the DATA statement. This seems a good opportunity to use the OUTPUT method for a hash table. We can load the results data set into the hash table, use the TAG as the key for the table, and add/update a row with the result before outputting the hash table as the updated results data set. Here's the code:
/* Load results into hash table */
length Tag $32 Result $4;
declare hash hrslt(dataset:"&resultdata");
rc = hrslt.defineKey('TAG');
rc = hrslt.defineData('TAG','RESULT');
rc = hrslt.defineDone();
/* Update the hash table */
tag = "&tag";
if &left &operator &right then
rc=hrslt.replace(); /* Add/update */
/* Write back the results data set */
rc = hrslt.output(dataset:"&resultdata");
rc = hrslt.delete();
By adding the maintenance of the results data set to our basic assert macro, the functionality gets inherited by any higher-level macro (such as yesterday's %assert_EqualRowCount).
Clearly, the new macro won't work if the results data set doesn't already exist, and we'd like to present the results in a format better than a plain data set. We'll cover that in the next post.