summaryrefslogtreecommitdiff
path: root/yaksh/java_stdio_evaluator.py
diff options
context:
space:
mode:
authorPrabhu Ramachandran2016-09-01 17:59:39 +0530
committerGitHub2016-09-01 17:59:39 +0530
commit01e08dd15b59ce353043d541c9be81592cda3fe0 (patch)
treeba1a9f7ffee92b79262b83fa9eb6eed303550f98 /yaksh/java_stdio_evaluator.py
parent27e7a443ef132e04cc5aeece7a5bf34d0687f482 (diff)
parenta4b636508d572cbe00ae8d0336c7b30494bad4a6 (diff)
downloadonline_test-01e08dd15b59ce353043d541c9be81592cda3fe0.tar.gz
online_test-01e08dd15b59ce353043d541c9be81592cda3fe0.tar.bz2
online_test-01e08dd15b59ce353043d541c9be81592cda3fe0.zip
Merge pull request #105 from adityacp/stdin_stdout_evaluator
Stdin stdout evaluators
Diffstat (limited to 'yaksh/java_stdio_evaluator.py')
-rw-r--r--yaksh/java_stdio_evaluator.py81
1 files changed, 81 insertions, 0 deletions
diff --git a/yaksh/java_stdio_evaluator.py b/yaksh/java_stdio_evaluator.py
new file mode 100644
index 0000000..27dd4a9
--- /dev/null
+++ b/yaksh/java_stdio_evaluator.py
@@ -0,0 +1,81 @@
+#!/usr/bin/env python
+import subprocess
+import os
+from os.path import isfile
+
+#local imports
+from code_evaluator import CodeEvaluator
+from stdio_evaluator import Evaluator
+from file_utils import copy_files, delete_files
+
+
+class JavaStdioEvaluator(CodeEvaluator):
+ """Evaluates Java StdIO based code"""
+
+ def setup(self):
+ super(JavaStdioEvaluator, self).setup()
+ self.submit_code_path = self.create_submit_code_file('Test.java')
+
+ def teardown(self):
+ super(JavaStdioEvaluator, self).teardown()
+ os.remove(self.submit_code_path)
+ if self.files:
+ delete_files(self.files)
+
+ def set_file_paths(self, directory, file_name):
+ output_path = "{0}{1}.class".format(directory, file_name)
+ return output_path
+
+ def get_commands(self):
+ compile_command = 'javac {0}'.format(self.submit_code_path)
+ return compile_command
+
+ def compile_code(self, user_answer, file_paths, expected_input, expected_output):
+ self.files = []
+ if not isfile(self.submit_code_path):
+ msg = "No file at %s or Incorrect path" % self.submit_code_path
+ return False, msg
+ if file_paths:
+ self.files = copy_files(file_paths)
+ user_code_directory = os.getcwd() + '/'
+ self.write_to_submit_code_file(self.submit_code_path, user_answer)
+ self.user_output_path = self.set_file_paths(user_code_directory,
+ 'Test'
+ )
+ self.compile_command = self.get_commands()
+ self.compiled_user_answer = self._run_command(self.compile_command,
+ shell=True,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE
+ )
+ return self.compiled_user_answer
+
+ def check_code(self, user_answer, file_paths, expected_input, expected_output):
+ success = False
+ proc, stdnt_out, stdnt_stderr = self.compiled_user_answer
+ stdnt_stderr = self._remove_null_substitute_char(stdnt_stderr)
+ if stdnt_stderr == '' or "error" not in stdnt_stderr:
+ proc = subprocess.Popen("java Test",
+ shell=True,
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE
+ )
+ evaluator = Evaluator()
+ success, err = evaluator.evaluate(user_answer, proc,
+ expected_input,
+ expected_output
+ )
+ os.remove(self.user_output_path)
+ else:
+ err = "Compilation Error:"
+ try:
+ error_lines = stdnt_stderr.splitlines()
+ for e in error_lines:
+ if ':' in e:
+ err = err + "\n" + e.split(":", 1)[1]
+ else:
+ err = err + "\n" + e
+ except:
+ err = err + "\n" + stdnt_stderr
+ return success, err