Mercurial > ~astiob > upreckon > hgweb
comparison 2.00/testcases.py @ 26:5bbb68833868
Output text improvements
Detailed error messages are now printed in more cases and have only their first letter forced into lowercase.
The description of the --update option now describes properly what it does.
| author | Oleg Oshmyan <chortos@inbox.lv> |
|---|---|
| date | Thu, 23 Sep 2010 23:50:45 +0000 |
| parents | b500e117080e |
| children | dc4be35d17e0 |
comparison
equal
deleted
inserted
replaced
| 25:b500e117080e | 26:5bbb68833868 |
|---|---|
| 290 if not case.problem.config.tester: | 290 if not case.problem.config.tester: |
| 291 case.validator = None | 291 case.validator = None |
| 292 else: | 292 else: |
| 293 case.validator = case.problem.config.tester | 293 case.validator = case.problem.config.tester |
| 294 | 294 |
| 295 # TODO | |
| 296 def validate(case, output): | 295 def validate(case, output): |
| 297 if not case.validator: | 296 if not case.validator: |
| 298 # Compare the output with the reference output | 297 # Compare the output with the reference output |
| 299 case.open_outfile() | 298 case.open_outfile() |
| 300 with case.outfile.open() as refoutput: | 299 with case.outfile.open() as refoutput: |
| 315 try: | 314 try: |
| 316 case.process = Popen(case.validator, stdin=devnull, stdout=PIPE, stderr=STDOUT, universal_newlines=True, bufsize=-1) | 315 case.process = Popen(case.validator, stdin=devnull, stdout=PIPE, stderr=STDOUT, universal_newlines=True, bufsize=-1) |
| 317 except OSError: | 316 except OSError: |
| 318 raise CannotStartValidator(sys.exc_info()[1]) | 317 raise CannotStartValidator(sys.exc_info()[1]) |
| 319 comment = case.process.communicate()[0].strip() | 318 comment = case.process.communicate()[0].strip() |
| 320 match = re.match(r'(?i)(ok|correct|wrong(?:(?:\s|_)*answer)?)(?:$|\s+|[.,!:]+\s*)', comment) | 319 match = re.match(r'(?i)(ok|(?:correct|wrong)(?:(?:\s|_)*answer)?)(?:$|\s+|[.,!:]+\s*)', comment) |
| 321 if match: | 320 if match: |
| 322 comment = comment[match.end():] | 321 comment = comment[match.end():] |
| 323 if not case.problem.config.maxexitcode: | 322 if not case.problem.config.maxexitcode: |
| 324 if case.process.returncode: | 323 if case.process.returncode: |
| 325 raise WrongAnswer(comment) | 324 raise WrongAnswer(comment) |
| 372 try: | 371 try: |
| 373 case.process = Popen(case.problem.config.path, stdin=infile, stdout=outfile, stderr=devnull, universal_newlines=True, bufsize=-1, preexec_fn=preexec_fn) | 372 case.process = Popen(case.problem.config.path, stdin=infile, stdout=outfile, stderr=devnull, universal_newlines=True, bufsize=-1, preexec_fn=preexec_fn) |
| 374 except MemoryError: | 373 except MemoryError: |
| 375 # If there is not enough memory for the forked test.py, | 374 # If there is not enough memory for the forked test.py, |
| 376 # opt for silent dropping of the limit | 375 # opt for silent dropping of the limit |
| 376 # TODO: show a warning somewhere | |
| 377 case.process = Popen(case.problem.config.path, stdin=infile, stdout=outfile, stderr=devnull, universal_newlines=True, bufsize=-1) | 377 case.process = Popen(case.problem.config.path, stdin=infile, stdout=outfile, stderr=devnull, universal_newlines=True, bufsize=-1) |
| 378 except OSError: | 378 except OSError: |
| 379 raise CannotStartTestee(sys.exc_info()[1]) | 379 raise CannotStartTestee(sys.exc_info()[1]) |
| 380 case.time_started = clock() | 380 case.time_started = clock() |
| 381 time_next_check = case.time_started + .15 | 381 time_next_check = case.time_started + .15 |
| 422 try: | 422 try: |
| 423 case.process = Popen(case.problem.config.path, stdin=devnull, stdout=devnull, stderr=STDOUT, preexec_fn=preexec_fn) | 423 case.process = Popen(case.problem.config.path, stdin=devnull, stdout=devnull, stderr=STDOUT, preexec_fn=preexec_fn) |
| 424 except MemoryError: | 424 except MemoryError: |
| 425 # If there is not enough memory for the forked test.py, | 425 # If there is not enough memory for the forked test.py, |
| 426 # opt for silent dropping of the limit | 426 # opt for silent dropping of the limit |
| 427 # TODO: show a warning somewhere | |
| 427 case.process = Popen(case.problem.config.path, stdin=devnull, stdout=devnull, stderr=STDOUT) | 428 case.process = Popen(case.problem.config.path, stdin=devnull, stdout=devnull, stderr=STDOUT) |
| 428 except OSError: | 429 except OSError: |
| 429 raise CannotStartTestee(sys.exc_info()[1]) | 430 raise CannotStartTestee(sys.exc_info()[1]) |
| 430 case.time_started = clock() | 431 case.time_started = clock() |
| 431 time_next_check = case.time_started + .15 | 432 time_next_check = case.time_started + .15 |
| 478 class ReactiveTestCase(TestCase): | 479 class ReactiveTestCase(TestCase): |
| 479 __slots__ = () | 480 __slots__ = () |
| 480 # The basic idea is to launch the program to be tested and the grader | 481 # The basic idea is to launch the program to be tested and the grader |
| 481 # and to pipe their standard I/O from and to each other, | 482 # and to pipe their standard I/O from and to each other, |
| 482 # and then to capture the grader's exit code and use it | 483 # and then to capture the grader's exit code and use it |
| 483 # like the exit code of a test validator is used. | 484 # like the exit code of an output validator is used. |
| 484 | 485 |
| 485 | 486 |
| 486 def load_problem(prob, _types={'batch' : BatchTestCase, | 487 def load_problem(prob, _types={'batch' : BatchTestCase, |
| 487 'outonly' : OutputOnlyTestCase, | 488 'outonly' : OutputOnlyTestCase, |
| 488 'bestout' : BestOutputTestCase, | 489 'bestout' : BestOutputTestCase, |
