From 1f8e19179140f3ebdb78428f125163d61c905c78 Mon Sep 17 00:00:00 2001 From: janmax <mail-github@jmx.io> Date: Thu, 13 Jul 2017 11:16:44 +0200 Subject: [PATCH] Tests are now displayed in single submission view --- .../core/component/tests_editor.html | 27 +++++++++++++++++++ core/templates/core/feedback_form.html | 7 ++--- core/templates/core/r/single_submission.html | 3 ++- core/templates/core/s/single_submission.html | 2 +- util/importer.py | 4 ++- util/processing.py | 12 ++++----- util/testcases.py | 4 +-- 7 files changed, 45 insertions(+), 14 deletions(-) create mode 100644 core/templates/core/component/tests_editor.html diff --git a/core/templates/core/component/tests_editor.html b/core/templates/core/component/tests_editor.html new file mode 100644 index 00000000..36239778 --- /dev/null +++ b/core/templates/core/component/tests_editor.html @@ -0,0 +1,27 @@ +{# Custom feedback from the compiler #} +<div class="card my-1"> + <a data-toggle="collapse" href="#collapse4"> + <h5 class="card-header">Tester Output</h5> + </a> + <div id="collapse4" class="collapse hide" role="tabpanel"> + <div class="card-block m-2"> + <div id="tests_editor" class="editor editor-pre">{% for test in submission.tests.all %} +# {{test.name}} +{{test.annotation}} +RESULT: {{test.label}} +------------------------------------------------- +{% endfor %} + </div> + </div> + </div> + <script> + var editor_pre = ace.edit("tests_editor"); + editor_pre.setOptions({ + readOnly: true, + showGutter: false, + highlightActiveLine: false, + maxLines: Infinity, + }) + </script> +</div> + diff --git a/core/templates/core/feedback_form.html b/core/templates/core/feedback_form.html index 11a17e6c..601aa89b 100644 --- a/core/templates/core/feedback_form.html +++ b/core/templates/core/feedback_form.html @@ -27,10 +27,11 @@ </a> <div id="collapse4" class="collapse show" role="tabpanel"> <div class="card-block m-2"> - <div id="pre_corrections" class="editor editor-pre">{% for test in feedback.of_submission.tests.all %} -{{test.name}} + <div id="tests_editor" class="editor editor-pre">{% for test in feedback.of_submission.tests.all %} +# {{test.name}} {{test.annotation}} RESULT: {{test.label}} +------------------------------------------------- {% endfor %}</div> </div> </div> @@ -151,7 +152,7 @@ RESULT: {{test.label}} {% endif %} // we need this one for the compiler erros readonly - var editor_pre = ace.edit("pre_corrections"); + var editor_pre = ace.edit("tests_editor"); editor_pre.setOptions({ readOnly: true, showGutter: false, diff --git a/core/templates/core/r/single_submission.html b/core/templates/core/r/single_submission.html index 3e283e9e..59f26832 100644 --- a/core/templates/core/r/single_submission.html +++ b/core/templates/core/r/single_submission.html @@ -47,10 +47,11 @@ <div class="col-4 my-4"> <div class="card"> <div class="card-block"> - <div class="card-header">Your submission</div> + <div class="card-header">Student submission</div> <div class="editor-code" id="textarea_submission">{{submission.text}}</div> </div> </div> + {% include "core/component/tests_editor.html" %} </div> {% if feedback %} diff --git a/core/templates/core/s/single_submission.html b/core/templates/core/s/single_submission.html index cc346a89..cf08272e 100644 --- a/core/templates/core/s/single_submission.html +++ b/core/templates/core/s/single_submission.html @@ -37,9 +37,9 @@ <div class="editor-code" id="textarea_submission">{{submission.text}}</div> </div> </div> + {% include "core/component/tests_editor.html" %} </div> - {% if feedback %} {% if feedback.status == feedback.ACCEPTED %} <div class="col-4 my-4"> diff --git a/util/importer.py b/util/importer.py index 1a04a22f..9b6226ec 100644 --- a/util/importer.py +++ b/util/importer.py @@ -39,6 +39,7 @@ TEST_ORDER = ( util.processing.EmptyTest.__name__, util.processing.CompileTest.__name__, util.processing.LinkTest.__name__, + util.processing.UnitTestTest.__name__, ) @@ -170,7 +171,8 @@ def add_submission(student_obj, code, tests, type): ) if test_obj.label == available_tests[test_obj.name].label_failure\ - and not hasattr(test_obj.submission, 'feedback'): + and not hasattr(test_obj.submission, 'feedback')\ + and not test_obj.name == util.processing.UnitTestTest.__name__: Feedback.objects.update_or_create( of_submission=submission_obj, defaults={ diff --git a/util/processing.py b/util/processing.py index 21acf939..e83a44eb 100644 --- a/util/processing.py +++ b/util/processing.py @@ -15,20 +15,20 @@ except ModuleNotFoundError: DESCFILE = '../data/descfile.txt' BINARIES = '../data/klausur_zweittermin/bin' OBJECTS = '../data/klausur_zweittermin/objects' -SUBMISSIONS = '../data/ok.json' +SUBMISSIONS = '../data/binf1801_pre.json' HEADER = '../data/klausur_zweittermin/code-testing' -def run_cmd(cmd, stdin=None, check=False): +def run_cmd(cmd, stdin=None, check=False, timeout=1): return subprocess.run( - 'ulimit -v 1024;' + cmd, + 'ulimit -v 1024; gtimeout 0.2 ' + cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE, input=stdin, shell=True, check=check, encoding='utf-8', - timeout=0.5 + timeout=timeout ) @@ -119,7 +119,7 @@ class CompileTest(Test): def run_test(self, submission_obj): - ret = run_cmd("gcc-7 -c -xc -Icode-testing -o code.o -", + ret = run_cmd("gcc-7 -std=c11 -Wall -c -xc -Icode-testing -o code.o -", submission_obj['code']) return not ret.returncode, ret.stderr @@ -149,7 +149,7 @@ class UnitTestTest(Test): @staticmethod def testcase(i, args, stdout): try: - ret = run_cmd("./code %s" % args, check=True) + ret = run_cmd("./code %s" % args, check=True, timeout=0.1) assert ret.stdout == stdout except AssertionError: return False, f"Case #{i:>2}: [ASSERT FAILED] ./program {args} WAS '{ret.stdout.strip()}' SHOULD '{stdout.strip()}'" diff --git a/util/testcases.py b/util/testcases.py index 491d3074..b94fab23 100644 --- a/util/testcases.py +++ b/util/testcases.py @@ -30,7 +30,7 @@ def unsigned_integer(upper=50): def character(): - return random.choice(5*ascii_letters + 2*digits + '%*+,-./:?@[]^_{}~') + return random.choice(10*ascii_letters + 2*digits + '%*+,-./:?@[]^_{}~') def string(lenght=31): @@ -39,7 +39,7 @@ def string(lenght=31): def type_list(_type): def generic_list(): - return ' '.join(str(call_function(_type)) for i in range(unsigned_integer(5) * 2)) + return ' '.join(str(call_function(_type)) for i in range(2, unsigned_integer(6) * 2)) return generic_list -- GitLab