Mercurial > ~astiob > upreckon > hgweb
comparison 2.00/testcases.py @ 23:c1f52b5d80d6
Compatibility and bug fixes
-1 command line option added (currently only detects the presence of test groups).
The ansname configuration variable is now (again) optional when output validators are used.
Bug fix: path realization only looked at paths beginning with tests/.
Bug fix: non-reiterable values of the tests configuration variable are now handled correctly.
Bug fix: an exceptions was raised if a problem had no test cases.
author | Oleg Oshmyan <chortos@inbox.lv> |
---|---|
date | Wed, 22 Sep 2010 23:34:51 +0000 |
parents | f07b7a431ea6 |
children | c23d81f4a1a3 |
comparison
equal
deleted
inserted
replaced
22:f07b7a431ea6 | 23:c1f52b5d80d6 |
---|---|
325 elif callable(case.validator): | 325 elif callable(case.validator): |
326 return case.validator(output) | 326 return case.validator(output) |
327 else: | 327 else: |
328 # Call the validator program | 328 # Call the validator program |
329 output.close() | 329 output.close() |
330 case.open_outfile() | 330 if case.problem.config.ansname: |
331 case.outfile.copy(case.problem.config.ansname) | 331 case.open_outfile() |
332 case.outfile.copy(case.problem.config.ansname) | |
332 case.process = Popen(case.validator, stdin=devnull, stdout=PIPE, stderr=STDOUT, universal_newlines=True, bufsize=-1) | 333 case.process = Popen(case.validator, stdin=devnull, stdout=PIPE, stderr=STDOUT, universal_newlines=True, bufsize=-1) |
333 comment = case.process.communicate()[0].strip() | 334 comment = case.process.communicate()[0].strip() |
334 lower = comment.lower() | 335 lower = comment.lower() |
335 match = re.match(r'(ok|correct|wrong(?:(?:\s|_)*answer)?)(?:$|\s+|[.,!:]+\s*)', lower) | 336 match = re.match(r'(ok|correct|wrong(?:(?:\s|_)*answer)?)(?:$|\s+|[.,!:]+\s*)', lower) |
336 if match: | 337 if match: |
379 inputdatafname = case.problem.config.inname | 380 inputdatafname = case.problem.config.inname |
380 context = Copying(case.infile, inputdatafname) | 381 context = Copying(case.infile, inputdatafname) |
381 with context: | 382 with context: |
382 with open(inputdatafname, 'rU') as infile: | 383 with open(inputdatafname, 'rU') as infile: |
383 with tempfile.TemporaryFile('w+') if options.erase and not case.validator else open(case.problem.config.outname, 'w+') as outfile: | 384 with tempfile.TemporaryFile('w+') if options.erase and not case.validator else open(case.problem.config.outname, 'w+') as outfile: |
385 # TODO: make sure outfile.file is passed to Popen if needed | |
384 try: | 386 try: |
385 try: | 387 try: |
386 case.process = Popen(case.problem.config.path, stdin=infile, stdout=outfile, stderr=devnull, universal_newlines=True, bufsize=-1, preexec_fn=preexec_fn) | 388 case.process = Popen(case.problem.config.path, stdin=infile, stdout=outfile, stderr=devnull, universal_newlines=True, bufsize=-1, preexec_fn=preexec_fn) |
387 except MemoryError: | 389 except MemoryError: |
388 # If there is not enough memory for the forked test.py, | 390 # If there is not enough memory for the forked test.py, |
474 | 476 |
475 def load_problem(prob, _types={'batch' : BatchTestCase, | 477 def load_problem(prob, _types={'batch' : BatchTestCase, |
476 'outonly' : OutputOnlyTestCase, | 478 'outonly' : OutputOnlyTestCase, |
477 'bestout' : BestOutputTestCase, | 479 'bestout' : BestOutputTestCase, |
478 'reactive': ReactiveTestCase}): | 480 'reactive': ReactiveTestCase}): |
481 if options.legacy: | |
482 prob.config.usegroups = False | |
483 prob.config.tests = list(prob.config.tests) | |
484 for i, name in enumerate(prob.config.tests): | |
485 try: | |
486 if len(name) > 1: | |
487 prob.config.usegroups = True | |
488 break | |
489 elif len(name): | |
490 prob.config.tests[i] = name[0] | |
491 except Exception: | |
492 try: | |
493 # Try to retrieve the first two test case ID's and cache them on success | |
494 prob.config.tests[i] = name = iter(name) | |
495 except TypeError: | |
496 continue | |
497 try: | |
498 try: | |
499 first = next(name) | |
500 except NameError: | |
501 # Python 2.5 lacks the next() built-in | |
502 first = name.next() | |
503 except StopIteration: | |
504 prob.config.tests[i] = () | |
505 else: | |
506 try: | |
507 try: | |
508 second = next(name) | |
509 except NameError: | |
510 second = name.next() | |
511 except StopIteration: | |
512 prob.config.tests[i] = first | |
513 else: | |
514 prob.config.tests[i] = itertools.chain((first, second), name) | |
515 prob.config.usegroups = True | |
516 break | |
479 if prob.config.usegroups: | 517 if prob.config.usegroups: |
480 # FIXME: test groups should again be supported! | 518 # FIXME: test groups should again be supported! |
481 pass | 519 pass |
482 else: | 520 else: |
483 # We will need to iterate over these configuration variables twice | 521 # We will need to iterate over these configuration variables twice |
486 except Exception: | 524 except Exception: |
487 prob.config.dummies = tuple(prob.config.dummies) | 525 prob.config.dummies = tuple(prob.config.dummies) |
488 try: | 526 try: |
489 len(prob.config.tests) | 527 len(prob.config.tests) |
490 except Exception: | 528 except Exception: |
491 prob.config.dummies = tuple(prob.config.tests) | 529 prob.config.tests = tuple(prob.config.tests) |
492 # First get prob.cache.padoutput right | 530 # First get prob.cache.padoutput right |
493 for i in prob.config.dummies: | 531 for i in prob.config.dummies: |
494 s = 'sample ' + str(i).zfill(prob.config.paddummies) | 532 s = 'sample ' + str(i).zfill(prob.config.paddummies) |
495 prob.cache.padoutput = max(prob.cache.padoutput, len(s)) | 533 prob.cache.padoutput = max(prob.cache.padoutput, len(s)) |
496 for i in prob.config.tests: | 534 for i in prob.config.tests: |