summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--yaksh/cpp_code_evaluator.py4
-rw-r--r--yaksh/cpp_stdio_evaluator.py3
-rw-r--r--yaksh/error_messages.py5
-rw-r--r--yaksh/evaluator_tests/test_c_cpp_evaluation.py29
-rw-r--r--yaksh/evaluator_tests/test_java_evaluation.py23
-rw-r--r--yaksh/grader.py7
-rw-r--r--yaksh/java_code_evaluator.py4
-rw-r--r--yaksh/java_stdio_evaluator.py2
8 files changed, 52 insertions, 25 deletions
diff --git a/yaksh/cpp_code_evaluator.py b/yaksh/cpp_code_evaluator.py
index 8bd3beb..d249c66 100644
--- a/yaksh/cpp_code_evaluator.py
+++ b/yaksh/cpp_code_evaluator.py
@@ -7,6 +7,7 @@ import subprocess
# Local imports
from .file_utils import copy_files, delete_files
from .base_evaluator import BaseEvaluator
+from .grader import CompilationError, TestCaseError
class CppCodeEvaluator(BaseEvaluator):
@@ -141,6 +142,7 @@ class CppCodeEvaluator(BaseEvaluator):
mark_fraction = 1.0 if self.partial_grading else 0.0
else:
err = "{0} \n {1}".format(stdout, stderr)
+ raise AssertionError(err)
else:
err = "Test case Error:"
try:
@@ -152,6 +154,7 @@ class CppCodeEvaluator(BaseEvaluator):
err = "{0} \n {1}".format(err, e)
except Exception:
err = "{0} \n {1}".format(err, main_err)
+ raise TestCaseError(err)
else:
err = "Compilation Error:"
try:
@@ -163,5 +166,6 @@ class CppCodeEvaluator(BaseEvaluator):
err = "{0} \n {1}".format(err, e)
except Exception:
err = "{0} \n {1}".format(err, stdnt_stderr)
+ raise CompilationError(err)
return success, err, mark_fraction
diff --git a/yaksh/cpp_stdio_evaluator.py b/yaksh/cpp_stdio_evaluator.py
index 4e8f8df..26d655f 100644
--- a/yaksh/cpp_stdio_evaluator.py
+++ b/yaksh/cpp_stdio_evaluator.py
@@ -7,7 +7,7 @@ from os.path import isfile
# Local imports
from .stdio_evaluator import StdIOEvaluator
from .file_utils import copy_files, delete_files
-
+from .grader import CompilationError
class CppStdIOEvaluator(StdIOEvaluator):
"""Evaluates C StdIO based code"""
@@ -104,5 +104,6 @@ class CppStdIOEvaluator(StdIOEvaluator):
err = err + "\n" + e
except Exception:
err = err + "\n" + stdnt_stderr
+ raise CompilationError(err)
mark_fraction = 1.0 if self.partial_grading and success else 0.0
return success, err, mark_fraction
diff --git a/yaksh/error_messages.py b/yaksh/error_messages.py
index 512d664..86375bf 100644
--- a/yaksh/error_messages.py
+++ b/yaksh/error_messages.py
@@ -11,7 +11,10 @@ def prettify_exceptions(exception, message, traceback=None,
"traceback": traceback,
"message": message
}
- if exception == 'RuntimeError' or exception == 'RecursionError':
+ ignore_traceback = ['RuntimeError','RecursionError',
+ "CompilationError", "TestCaseError"
+ ]
+ if exception in ignore_traceback:
err["traceback"] = None
if exception == 'AssertionError':
diff --git a/yaksh/evaluator_tests/test_c_cpp_evaluation.py b/yaksh/evaluator_tests/test_c_cpp_evaluation.py
index 5b49671..17f7c82 100644
--- a/yaksh/evaluator_tests/test_c_cpp_evaluation.py
+++ b/yaksh/evaluator_tests/test_c_cpp_evaluation.py
@@ -100,12 +100,12 @@ class CAssertionEvaluationTestCases(EvaluatorBaseTest):
# When
grader = Grader(self.in_dir)
result = grader.evaluate(kwargs)
-
+ errors = result.get('error')
# Then
- lines_of_error = len(result.get('error')[0].splitlines())
self.assertFalse(result.get('success'))
- self.assert_correct_output("Incorrect:", result.get('error'))
- self.assertTrue(lines_of_error > 1)
+ for error in errors:
+ self.assertEqual(error['exception'], 'AssertionError')
+
def test_compilation_error(self):
# Given
@@ -122,10 +122,12 @@ class CAssertionEvaluationTestCases(EvaluatorBaseTest):
# When
grader = Grader(self.in_dir)
result = grader.evaluate(kwargs)
+ errors = result.get('error')
# Then
self.assertFalse(result.get("success"))
- self.assert_correct_output("Compilation Error", result.get("error"))
+ for error in errors:
+ self.assertEqual(error['exception'], 'CompilationError')
def test_infinite_loop(self):
# Given
@@ -272,14 +274,12 @@ class CAssertionEvaluationTestCases(EvaluatorBaseTest):
# When
grader = Grader(self.in_dir)
result = grader.evaluate(kwargs)
+ errors = result.get("error")
# Then
- err = result.get('error')[0]
- lines_of_error = len(err.splitlines())
self.assertFalse(result.get('success'))
- self.assertTrue(lines_of_error > 1)
- self.assertIn("Test case Error", err)
-
+ for error in errors:
+ self.assertEqual(error['exception'], 'TestCaseError')
class CppStdIOEvaluationTestCases(EvaluatorBaseTest):
def setUp(self):
@@ -432,10 +432,13 @@ class CppStdIOEvaluationTestCases(EvaluatorBaseTest):
# When
grader = Grader(self.in_dir)
result = grader.evaluate(kwargs)
+ errors = result.get('error')
# Then
self.assertFalse(result.get("success"))
- self.assert_correct_output("Compilation Error", result.get("error"))
+ for error in errors:
+ self.assertEqual(error['exception'], 'CompilationError')
+
def test_infinite_loop(self):
# Given
@@ -636,10 +639,12 @@ class CppStdIOEvaluationTestCases(EvaluatorBaseTest):
# When
grader = Grader(self.in_dir)
result = grader.evaluate(kwargs)
+ errors = result.get('error')
# Then
self.assertFalse(result.get("success"))
- self.assert_correct_output("Compilation Error", result.get("error"))
+ for error in errors:
+ self.assertEqual(error['exception'], 'CompilationError')
def test_cpp_infinite_loop(self):
# Given
diff --git a/yaksh/evaluator_tests/test_java_evaluation.py b/yaksh/evaluator_tests/test_java_evaluation.py
index ab86dec..eb09f2f 100644
--- a/yaksh/evaluator_tests/test_java_evaluation.py
+++ b/yaksh/evaluator_tests/test_java_evaluation.py
@@ -113,13 +113,12 @@ class JavaAssertionEvaluationTestCases(EvaluatorBaseTest):
# When
grader = Grader(self.in_dir)
result = grader.evaluate(kwargs)
+ errors = result.get('error')
# Then
self.assertFalse(result.get('success'))
- lines_of_error = len(result.get('error')[0].splitlines())
- self.assertFalse(result.get('success'))
- self.assert_correct_output("Incorrect", result.get('error'))
- self.assertTrue(lines_of_error > 1)
+ for error in errors:
+ self.assertEqual(error.get('exception'), 'AssertionError')
def test_error(self):
# Given
@@ -136,10 +135,11 @@ class JavaAssertionEvaluationTestCases(EvaluatorBaseTest):
# When
grader = Grader(self.in_dir)
result = grader.evaluate(kwargs)
-
+ errors = result.get('error')
# Then
self.assertFalse(result.get("success"))
- self.assert_correct_output("Error", result.get("error"))
+ for error in errors:
+ self.assertEqual(error.get('exception'), 'CompilationError')
def test_infinite_loop(self):
# Given
@@ -290,13 +290,12 @@ class JavaAssertionEvaluationTestCases(EvaluatorBaseTest):
# When
grader = Grader(self.in_dir)
result = grader.evaluate(kwargs)
+ errors = result.get('error')
# Then
- err = result.get('error')[0]
- lines_of_error = len(err.splitlines())
self.assertFalse(result.get('success'))
- self.assertTrue(lines_of_error > 1)
- self.assertIn("Test case Error", err)
+ for error in errors:
+ self.assertEqual(error.get('exception'), 'TestCaseError')
class JavaStdIOEvaluationTestCases(EvaluatorBaseTest):
@@ -432,10 +431,12 @@ class JavaStdIOEvaluationTestCases(EvaluatorBaseTest):
# When
grader = Grader(self.in_dir)
result = grader.evaluate(kwargs)
+ errors = result.get('error')
# Then
self.assertFalse(result.get("success"))
- self.assertTrue("Compilation Error" in '\n'.join(result.get("error")))
+ for error in errors:
+ self.assertEqual(error.get('exception'), 'CompilationError')
def test_infinite_loop(self):
# Given
diff --git a/yaksh/grader.py b/yaksh/grader.py
index 320e7e7..de8f897 100644
--- a/yaksh/grader.py
+++ b/yaksh/grader.py
@@ -23,6 +23,13 @@ class TimeoutException(Exception):
pass
+class CompilationError(Exception):
+ pass
+
+
+class TestCaseError(Exception):
+ pass
+
@contextlib.contextmanager
def change_dir(path):
cur_dir = abspath(dirname(MY_DIR))
diff --git a/yaksh/java_code_evaluator.py b/yaksh/java_code_evaluator.py
index 5f2288d..35573c0 100644
--- a/yaksh/java_code_evaluator.py
+++ b/yaksh/java_code_evaluator.py
@@ -7,6 +7,7 @@ import subprocess
# Local imports
from .base_evaluator import BaseEvaluator
from .file_utils import copy_files, delete_files
+from .grader import CompilationError, TestCaseError
class JavaCodeEvaluator(BaseEvaluator):
@@ -149,6 +150,7 @@ class JavaCodeEvaluator(BaseEvaluator):
mark_fraction = 1.0 if self.partial_grading else 0.0
else:
err = stdout + "\n" + stderr
+ raise AssertionError(err)
else:
err = "Test case Error:"
try:
@@ -160,6 +162,7 @@ class JavaCodeEvaluator(BaseEvaluator):
err = err + "\n" + e
except Exception:
err = err + "\n" + main_err
+ raise TestCaseError(err)
else:
err = "Compilation Error:"
try:
@@ -171,5 +174,6 @@ class JavaCodeEvaluator(BaseEvaluator):
err = err + "\n" + e
except Exception:
err = err + "\n" + stdnt_stderr
+ raise CompilationError(err)
return success, err, mark_fraction
diff --git a/yaksh/java_stdio_evaluator.py b/yaksh/java_stdio_evaluator.py
index 0504177..89f9fc4 100644
--- a/yaksh/java_stdio_evaluator.py
+++ b/yaksh/java_stdio_evaluator.py
@@ -7,6 +7,7 @@ from os.path import isfile
# Local imports
from .stdio_evaluator import StdIOEvaluator
from .file_utils import copy_files, delete_files
+from .grader import CompilationError
class JavaStdIOEvaluator(StdIOEvaluator):
@@ -86,5 +87,6 @@ class JavaStdIOEvaluator(StdIOEvaluator):
err = err + "\n" + e
except Exception:
err = err + "\n" + stdnt_stderr
+ raise CompilationError(err)
mark_fraction = 1.0 if self.partial_grading and success else 0.0
return success, err, mark_fraction