From 6a2fcacf38b0635391d61836855b46870597544f Mon Sep 17 00:00:00 2001 From: Manuel Bucher <manuel.bucher@hu-berlin.de> Date: Fri, 22 Jun 2018 17:53:05 +0200 Subject: [PATCH] Check-Result hinzugefuegt --- check_result | 178 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100755 check_result diff --git a/check_result b/check_result new file mode 100755 index 0000000..666ac88 --- /dev/null +++ b/check_result @@ -0,0 +1,178 @@ +#!/usr/bin/env python +# +# by Holger Doebler <stephaho@informatik.hu-berlin.de> +# +# This python script is intended to help in verification of your solution +# of the Sommersemester 2018 Digitale Systeme C Programmierprojekt. +# +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +from __future__ import with_statement +from itertools import chain +import sys + +def print_help_message(): + print("""Usage: check_result [-q|-qq] INPUT|SAMPLE_OUTPUT YOUR_OUTPUT + + Depending on the first file given, checks for errors in the file + given as second argument. + +ARGUMENTS (required) + If the first argument is a sample output file as provided, it + checks whether SAMPLE_OUTPUT and YOUR_OUTPUT are compatible. + + If the first argument is an input file, check_result will check + whether YOUR_OUTPUT is a correct 1x2-tiling of the area defined by + INPUT. Note that check_result will not perform any checks, if + YOUR_OUTPUT states 'None', i.e., if your 'solution' is that there + does not exist a 1x2 tiling of the INPUT. + + If YOUR_OUTPUT is either "-" or omitted, it is read from stdin. + +OPTIONS + -q Only report errors. Suppress output PASSED and FAILED and INFO. + -qq Suppress all output. Exit code is the only feedback. + +WARNING + This script is intended to be portable across platforms and python + versions. IMHO it does not qualify as well-written modern + python. Use this script as it is. Trying to replicate any of its + functionality, e.g. reading the input, as part of your solution is + probably a very bad idea. + +EXIT CODES: + 0 Test passed. YOUR_OUTPUT seems to be correct. + 1 Uncaught exception. Please send a bug report. + 2 Invocation / IO error + 10-16 Malicious input file content. Input file itself cannot be correct. + 20 Cannot perform any checks. YOUR_OUTPUT is "None", which might be + correct. + 21 Test failed. YOUR_OUTPUT is wrong. + + +Send bug reports and suggestions for improvement to +Holger Doebler <stephaho@informatik.hu-berlin.de> +""") + sys.exit(2) + +verbosity = 2 +def pre(s): + if verbosity > 0: + print('ERROR: ' + s) + +def pri(s): + if verbosity > 1: + print(s) + +def read_tile_file(path, allow_input_file): + if path == '-': + f = sys.stdin + else: + try: + f = open(path) + except IOError: + print_help_message() + with f: + i = iter(f) + try: + l = next(i) + except UnicodeDecodeError: + pre('File "%s" contains illegal character.' % (path,)) + sys.exit(15) + except StopIteration: + pre('file "%s" seems to be empty.' % path) + sys.exit(2) + if l.strip() == 'None': + try: + l = next(i) + except UnicodeDecodeError: + pre('File "%s" line #%d contains illegal character.' % (path, 1)) + sys.exit(15) + except StopIteration: + return ('solution', None) + pre('file "%s" line "None" followed by further illegal lines.' + % path) + sys.exit(10) + lines = chain([l], i) + read_input_file = False + if allow_input_file: + read_input_file = True + try: + xy = tuple(map(int, l.split())) + if len(xy) != 2: + read_input_file = False + except ValueError: + read_input_file = False + res = set() + if read_input_file: + for j,l in enumerate(lines, start=1): + try: + xy = tuple(map(int, l.split())) + except ValueError: + xy = () + if len(xy) != 2 or xy[0] < 0 or xy[1] < 0: + pre('File %s line #%d does not have the correct ' + 'input file format.' % (path, j)) + sys.exit(14) + if xy in res: + pre('File "%s" line #%d is a duplicate.' % (path, j)) + sys.exit(15) + res.add(xy) + return ('input', res) + else: + for j,l in enumerate(lines, start=1): + try: + (x1,y1),(x2,y2) = tuple((tuple(map(int,x.split())) + for x in l.split(';'))) + if any([z < 0 for z in (x1,y1,x2,y2)]): + raise ValueError + except ValueError: + pre('Illegal line format in file "%s" line #%d.' + % (path, j)) + sys.exit(11) + if (x1!=x2 and y1!=y2) or (x1==x2 and y1==y2): + pre('File "%s" line #%d does not describe a 1x2tile.' + % (path, j)) + sys.exit(12) + for xy in ((x1,y1),(x2,y2)): + if xy in res: + pre('Tile in file "%s" line #%d overlaps with ' + 'other tiles in this file.' % (path, j)) + sys.exit(13) + res.add(xy) + return ('solution', res) + +if __name__=='__main__': + for verb, flag in enumerate(('-qq', '-q')): + while flag in sys.argv: + verbosity = verb + sys.argv.remove(flag) + if len(sys.argv) == 2: + sys.argv.append('-') + if len(sys.argv) != 3: + print_help_message() + t1 = read_tile_file(sys.argv[1], True) + t2 = read_tile_file(sys.argv[2], False) + if t1[1] == t2[1]: + pri('PASSED') + sys.exit(0) + if t2[1] is None and t1[0] == 'input': + pri('INFO: "%s" is an input file and "%s" sais "None". Cannot check ' + 'whether this is the correct answer.' + % tuple(sys.argv[1:])) + sys.exit(20) + else: + pri('FAILED') + sys.exit(21) -- GitLab