@@ -232,7 +232,8 @@ def __init__(self):
232232 def __getattr__ (self , key ):
233233 val = self ._values .get (key )
234234 if val is None :
235- logger .debug (f'... { key } ' )
235+ # this is too verbose
236+ # logger.debug(f'... {key}')
236237 try :
237238 ret = self ._functions [key ](self )
238239 except BaseException as e :
@@ -256,6 +257,27 @@ def add_value(self, name, value):
256257 self ._values [name ] = value
257258
258259
260+ def _eval_result (result , messages ):
261+ """evaluates `result` from calling a check function
262+
263+ returns 0 if check function succeeded, otherwise 1;
264+ appends to list `messages` if the result contains messages
265+ """
266+ # either a pair (success, messages)
267+ if isinstance (result , tuple ):
268+ success , msgs = result
269+ messages .extend (messages )
270+ return not success
271+ # or just a list of messages
272+ if isinstance (result , list ):
273+ if result :
274+ messages .extend (result )
275+ return 1
276+ return 0
277+ # or just a scalar (no messages)
278+ return not result
279+
280+
259281def harness (name , * check_fns ):
260282 """Harness for evaluating testcase `name`.
261283
@@ -268,15 +290,21 @@ def harness(name, *check_fns):
268290 - 'PASS' otherwise
269291 """
270292 logger .debug (f'** { name } ' )
293+ messages = []
271294 try :
272- result = all ( check_fn () for check_fn in check_fns )
295+ results = [ check_fn () for check_fn in check_fns ]
273296 except BaseException :
274297 logger .debug ('exception during check' , exc_info = True )
275298 result = 'ABORT'
276299 else :
277- result = ['FAIL' , 'PASS' ][min (1 , result )]
300+ fails = 0
301+ for r in results :
302+ fails += _eval_result (r , messages )
303+ result = ['FAIL' , 'PASS' ][fails == 0 ]
278304 # this is quite redundant
279305 # logger.debug(f'** computation end for {name}')
306+ for msg in messages :
307+ print (f"{ name } : { msg } " )
280308 print (f"{ name } : { result } " )
281309
282310
0 commit comments