registration implemented
This commit is contained in:
80
SprintLib/testers/BaseTester.py
Normal file
80
SprintLib/testers/BaseTester.py
Normal file
@@ -0,0 +1,80 @@
|
||||
from os import listdir
|
||||
from os.path import join
|
||||
from shutil import copyfile, rmtree
|
||||
from subprocess import call, TimeoutExpired
|
||||
|
||||
from Main.models import ExtraFile
|
||||
from Sprint.settings import CONSTS
|
||||
from SprintLib.utils import copy_content
|
||||
|
||||
|
||||
class TestException(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class BaseTester:
|
||||
working_directory = "app"
|
||||
|
||||
def before_test(self):
|
||||
files = [file for file in listdir(self.solution.testing_directory) if file.endswith('.' + self.solution.language.file_type)]
|
||||
code = self.solution.exec_command(f'{self.build_command} {" ".join(files)}', working_directory=self.working_directory)
|
||||
if code != 0:
|
||||
raise TestException('CE')
|
||||
|
||||
def test(self, filename):
|
||||
code = self.solution.exec_command(
|
||||
f"< {filename} {self.command} > output.txt",
|
||||
timeout=self.solution.task.time_limit / 1000,
|
||||
)
|
||||
if code != 0:
|
||||
raise TestException("RE")
|
||||
result = open(
|
||||
join(self.solution.testing_directory, "output.txt"), "r"
|
||||
).read()
|
||||
if result.strip() != self.predicted.strip():
|
||||
raise TestException("WA")
|
||||
|
||||
def after_test(self):
|
||||
pass
|
||||
|
||||
@property
|
||||
def command(self):
|
||||
return "./executable.exe"
|
||||
|
||||
@property
|
||||
def build_command(self):
|
||||
return ""
|
||||
|
||||
def __init__(self, solution):
|
||||
self.solution = solution
|
||||
|
||||
def execute(self):
|
||||
copy_content(self.solution.directory, self.solution.testing_directory, ('test_dir',))
|
||||
self.solution.result = CONSTS["testing_status"]
|
||||
self.solution.save()
|
||||
call(
|
||||
f"docker run --name solution_{self.solution.id} --volume={self.solution.testing_directory}:/{self.working_directory} -t -d {self.solution.language.image}",
|
||||
shell=True,
|
||||
)
|
||||
for file in ExtraFile.objects.filter(task=self.solution.task):
|
||||
copyfile(file.path, join(self.solution.testing_directory, file.filename))
|
||||
try:
|
||||
self.before_test()
|
||||
for test in self.solution.task.tests:
|
||||
if not test.filename.endswith(".a"):
|
||||
self.predicted = ExtraFile.objects.get(
|
||||
task=self.solution.task, filename=test.filename + ".a"
|
||||
).text
|
||||
self.test(test.filename)
|
||||
self.after_test()
|
||||
self.solution.result = CONSTS["ok_status"]
|
||||
except TestException as e:
|
||||
self.solution.result = str(e)
|
||||
except TimeoutExpired:
|
||||
self.solution.result = "TL"
|
||||
except Exception as e:
|
||||
self.solution.result = "TE"
|
||||
print(str(e))
|
||||
self.solution.save()
|
||||
call(f"docker rm --force solution_{self.solution.id}", shell=True)
|
||||
rmtree(self.solution.testing_directory)
|
11
SprintLib/testers/CSharpTester.py
Normal file
11
SprintLib/testers/CSharpTester.py
Normal file
@@ -0,0 +1,11 @@
|
||||
from SprintLib.testers import BaseTester
|
||||
|
||||
|
||||
class CSharpTester(BaseTester):
|
||||
@property
|
||||
def build_command(self):
|
||||
return "csc /out:executable.exe"
|
||||
|
||||
@property
|
||||
def command(self):
|
||||
return "mono executable.exe"
|
9
SprintLib/testers/CppTester.py
Normal file
9
SprintLib/testers/CppTester.py
Normal file
@@ -0,0 +1,9 @@
|
||||
from os import listdir
|
||||
|
||||
from SprintLib.testers import BaseTester, TestException
|
||||
|
||||
|
||||
class CppTester(BaseTester):
|
||||
@property
|
||||
def build_command(self):
|
||||
return "g++ -o executable.exe"
|
8
SprintLib/testers/GoTester.py
Normal file
8
SprintLib/testers/GoTester.py
Normal file
@@ -0,0 +1,8 @@
|
||||
from SprintLib.testers import BaseTester
|
||||
|
||||
|
||||
class GoTester(BaseTester):
|
||||
working_directory = "../app"
|
||||
|
||||
def build_command(self):
|
||||
return "go build -o executable.exe"
|
23
SprintLib/testers/JavaTester.py
Normal file
23
SprintLib/testers/JavaTester.py
Normal file
@@ -0,0 +1,23 @@
|
||||
from os import listdir
|
||||
|
||||
from SprintLib.testers import BaseTester, TestException
|
||||
|
||||
|
||||
class JavaTester(BaseTester):
|
||||
_executable = None
|
||||
|
||||
def before_test(self):
|
||||
files = [file for file in listdir(self.solution.testing_directory) if file.endswith('.java')]
|
||||
code = self.solution.exec_command(f"javac {' '.join(files)}")
|
||||
if code != 0:
|
||||
raise TestException('CE')
|
||||
for file in listdir(self.solution.testing_directory):
|
||||
if file.endswith('.class'):
|
||||
self._executable = file.rstrip('.class')
|
||||
break
|
||||
if self._executable is None:
|
||||
raise TestException("TE")
|
||||
|
||||
@property
|
||||
def command(self):
|
||||
return f"java -classpath . {self._executable}"
|
15
SprintLib/testers/KotlinTester.py
Normal file
15
SprintLib/testers/KotlinTester.py
Normal file
@@ -0,0 +1,15 @@
|
||||
from os import listdir
|
||||
|
||||
from SprintLib.testers import BaseTester, TestException
|
||||
|
||||
|
||||
class KotlinTester(BaseTester):
|
||||
def before_test(self):
|
||||
files = [file for file in listdir(self.solution.testing_directory) if file.endswith('.kt')]
|
||||
code = self.solution.exec_command(f'kotlinc {" ".join(files)} -include-runtime -d solution.jar')
|
||||
if code != 0:
|
||||
raise TestException('CE')
|
||||
|
||||
@property
|
||||
def command(self):
|
||||
return "java -jar solution.jar"
|
19
SprintLib/testers/Python3Tester.py
Normal file
19
SprintLib/testers/Python3Tester.py
Normal file
@@ -0,0 +1,19 @@
|
||||
from os import listdir
|
||||
|
||||
from SprintLib.testers.BaseTester import BaseTester, TestException
|
||||
|
||||
|
||||
class Python3Tester(BaseTester):
|
||||
file = None
|
||||
|
||||
def before_test(self):
|
||||
for file in listdir(self.solution.testing_directory):
|
||||
if file.endswith(".py"):
|
||||
self.file = file
|
||||
break
|
||||
if self.file is None:
|
||||
raise TestException("TE")
|
||||
|
||||
@property
|
||||
def command(self):
|
||||
return f"python {self.file}"
|
7
SprintLib/testers/__init__.py
Normal file
7
SprintLib/testers/__init__.py
Normal file
@@ -0,0 +1,7 @@
|
||||
from .BaseTester import *
|
||||
from .Python3Tester import *
|
||||
from .CppTester import *
|
||||
from .GoTester import *
|
||||
from .JavaTester import *
|
||||
from .CSharpTester import *
|
||||
from .KotlinTester import *
|
Reference in New Issue
Block a user