summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.travis.yml8
-rw-r--r--yaksh/evaluator_tests/__init__.py0
-rw-r--r--yaksh/evaluator_tests/test_bash_evaluation.py41
-rw-r--r--yaksh/evaluator_tests/test_c_cpp_evaluation.py77
-rw-r--r--yaksh/evaluator_tests/test_code_evaluation.py24
-rw-r--r--yaksh/evaluator_tests/test_java_evaluation.py53
-rw-r--r--yaksh/evaluator_tests/test_python_evaluation.py53
-rw-r--r--yaksh/evaluator_tests/test_scilab_evaluation.py47
-rw-r--r--yaksh/tests.py17
9 files changed, 307 insertions, 13 deletions
diff --git a/.travis.yml b/.travis.yml
index d70a43b..8f48a88 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -9,7 +9,7 @@ env:
# command to install dependencies
install:
- - "easy_install git+https://github.com/FOSSEE/online_test.git#egg=django_exam-0.1"
+ - pip install git+https://github.com/FOSSEE/online_test.git#egg=yaksh-0.1
- pip install -q Django==$DJANGO --use-mirrors
before_install:
@@ -17,6 +17,6 @@ before_install:
- sudo apt-get install -y scilab
# command to run tests
-script:
- - nosetests ./yaksh/tests/
- - python manage.py test \ No newline at end of file
+script:
+ - test $DJANGO=1.5.7 && nosetests ./yaksh/evaluator_tests/
+ - python manage.py test yaksh \ No newline at end of file
diff --git a/yaksh/evaluator_tests/__init__.py b/yaksh/evaluator_tests/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/yaksh/evaluator_tests/__init__.py
diff --git a/yaksh/evaluator_tests/test_bash_evaluation.py b/yaksh/evaluator_tests/test_bash_evaluation.py
new file mode 100644
index 0000000..c6a5408
--- /dev/null
+++ b/yaksh/evaluator_tests/test_bash_evaluation.py
@@ -0,0 +1,41 @@
+import unittest
+import os
+from yaksh.bash_code_evaluator import BashCodeEvaluator
+from yaksh.settings import SERVER_TIMEOUT
+
+class BashEvaluationTestCases(unittest.TestCase):
+ def setUp(self):
+ self.language = "bash"
+ self.ref_code_path = "bash_files/sample.sh,bash_files/sample.args"
+ self.in_dir = "/tmp"
+ self.test_case_data = []
+ self.timeout_msg = ("Code took more than {0} seconds to run. "
+ "You probably have an infinite loop in your code.").format(SERVER_TIMEOUT)
+ self.test = None
+
+ def test_correct_answer(self):
+ user_answer = "#!/bin/bash\n[[ $# -eq 2 ]] && echo $(( $1 + $2 )) && exit $(( $1 + $2 ))"
+ get_class = BashCodeEvaluator(self.test_case_data, self.test, self.language, user_answer, self.ref_code_path, self.in_dir)
+ result = get_class.evaluate()
+
+ self.assertTrue(result.get("success"))
+ self.assertEqual(result.get("error"), "Correct answer")
+
+ def test_error(self):
+ user_answer = "#!/bin/bash\n[[ $# -eq 2 ]] && echo $(( $1 - $2 )) && exit $(( $1 - $2 ))"
+ get_class = BashCodeEvaluator(self.test_case_data, self.test, self.language, user_answer, self.ref_code_path, self.in_dir)
+ result = get_class.evaluate()
+
+ self.assertFalse(result.get("success"))
+ self.assertTrue("Error" in result.get("error"))
+
+ def test_infinite_loop(self):
+ user_answer = "#!/bin/bash\nwhile [ 1 ] ; do echo "" > /dev/null ; done"
+ get_class = BashCodeEvaluator(self.test_case_data, self.test, self.language, user_answer, self.ref_code_path, self.in_dir)
+ result = get_class.evaluate()
+
+ self.assertFalse(result.get("success"))
+ self.assertEquals(result.get("error"), self.timeout_msg)
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/yaksh/evaluator_tests/test_c_cpp_evaluation.py b/yaksh/evaluator_tests/test_c_cpp_evaluation.py
new file mode 100644
index 0000000..d01cc9c
--- /dev/null
+++ b/yaksh/evaluator_tests/test_c_cpp_evaluation.py
@@ -0,0 +1,77 @@
+import unittest
+import os
+from yaksh.cpp_code_evaluator import CppCodeEvaluator
+from yaksh.settings import SERVER_TIMEOUT
+
+class CEvaluationTestCases(unittest.TestCase):
+ def setUp(self):
+ self.language = "C"
+ self.ref_code_path = "c_cpp_files/main.cpp"
+ self.in_dir = "/tmp"
+ self.test_case_data = []
+ self.timeout_msg = ("Code took more than {0} seconds to run. "
+ "You probably have an infinite loop in your code.").format(SERVER_TIMEOUT)
+ self.test = None
+
+ def test_correct_answer(self):
+ user_answer = "int add(int a, int b)\n{return a+b;}"
+ get_class = CppCodeEvaluator(self.test_case_data, self.test, self.language, user_answer, self.ref_code_path, self.in_dir)
+ result = get_class.evaluate()
+
+ self.assertTrue(result.get("success"))
+ self.assertEqual(result.get("error"), "Correct answer")
+
+ def test_compilation_error(self):
+ user_answer = "int add(int a, int b)\n{return a+b}"
+ get_class = CppCodeEvaluator(self.test_case_data, self.test, self.language, user_answer, self.ref_code_path, self.in_dir)
+ result = get_class.evaluate()
+
+ self.assertFalse(result.get("success"))
+ self.assertTrue("Compilation Error" in result.get("error"))
+
+ def test_infinite_loop(self):
+ user_answer = "int add(int a, int b)\n{while(1>0){}}"
+ get_class = CppCodeEvaluator(self.test_case_data, self.test, self.language, user_answer, self.ref_code_path, self.in_dir)
+ result = get_class.evaluate()
+
+ self.assertFalse(result.get("success"))
+ self.assertEquals(result.get("error"), self.timeout_msg)
+
+
+###############################################################################
+class CppEvaluationTestCases(unittest.TestCase):
+ def setUp(self):
+ self.language = "CPP"
+ self.ref_code_path = "c_cpp_files/main.cpp"
+ self.in_dir = "/tmp"
+ self.test_case_data = []
+ self.timeout_msg = ("Code took more than {0} seconds to run. "
+ "You probably have an infinite loop in your code.").format(SERVER_TIMEOUT)
+ self.test = None
+
+ def test_correct_answer(self):
+ user_answer = "int add(int a, int b)\n{return a+b;}"
+ get_class = CppCodeEvaluator(self.test_case_data, self.test, self.language, user_answer, self.ref_code_path, self.in_dir)
+ result = get_class.evaluate()
+
+ self.assertTrue(result.get("success"))
+ self.assertEqual(result.get("error"), "Correct answer")
+
+ def test_compilation_error(self):
+ user_answer = "int add(int a, int b)\n{return a+b}"
+ get_class = CppCodeEvaluator(self.test_case_data, self.test, self.language, user_answer, self.ref_code_path, self.in_dir)
+ result = get_class.evaluate()
+
+ self.assertFalse(result.get("success"))
+ self.assertTrue("Compilation Error" in result.get("error"))
+
+ def test_infinite_loop(self):
+ user_answer = "int add(int a, int b)\n{while(1>0){}}"
+ get_class = CppCodeEvaluator(self.test_case_data, self.test, self.language, user_answer, self.ref_code_path, self.in_dir)
+ result = get_class.evaluate()
+
+ self.assertFalse(result.get("success"))
+ self.assertEquals(result.get("error"), self.timeout_msg)
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/yaksh/evaluator_tests/test_code_evaluation.py b/yaksh/evaluator_tests/test_code_evaluation.py
new file mode 100644
index 0000000..84701fb
--- /dev/null
+++ b/yaksh/evaluator_tests/test_code_evaluation.py
@@ -0,0 +1,24 @@
+import unittest
+import os
+from yaksh import python_code_evaluator
+from yaksh.language_registry import _LanguageRegistry, set_registry, get_registry
+from yaksh.settings import SERVER_TIMEOUT
+
+
+class RegistryTestCase(unittest.TestCase):
+ def setUp(self):
+ set_registry()
+ self.registry_object = get_registry()
+ self.language_registry = _LanguageRegistry()
+
+ def test_set_register(self):
+ class_name = getattr(python_code_evaluator, 'PythonCodeEvaluator')
+ self.registry_object.register("python", "yaksh.python_code_evaluator.PythonCodeEvaluator")
+ self.assertEquals(self.registry_object.get_class("python"), class_name)
+
+ def tearDown(self):
+ self.registry_object = None
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/yaksh/evaluator_tests/test_java_evaluation.py b/yaksh/evaluator_tests/test_java_evaluation.py
new file mode 100644
index 0000000..dfa1066
--- /dev/null
+++ b/yaksh/evaluator_tests/test_java_evaluation.py
@@ -0,0 +1,53 @@
+import unittest
+import os
+from yaksh import code_evaluator as evaluator
+from yaksh.java_code_evaluator import JavaCodeEvaluator
+
+
+class JavaEvaluationTestCases(unittest.TestCase):
+ def setUp(self):
+ self.language = "java"
+ self.ref_code_path = "java_files/main_square.java"
+ self.in_dir = "/tmp"
+ self.test_case_data = []
+ evaluator.SERVER_TIMEOUT = 9
+ self.timeout_msg = ("Code took more than {0} seconds to run. "
+ "You probably have an infinite loop in "
+ "your code.").format(evaluator.SERVER_TIMEOUT)
+ self.test = None
+
+ def tearDown(self):
+ evaluator.SERVER_TIMEOUT = 2
+
+ def test_correct_answer(self):
+ user_answer = "class Test {\n\tint square_num(int a) {\n\treturn a*a;\n\t}\n}"
+ get_class = JavaCodeEvaluator(self.test_case_data, self.test,
+ self.language, user_answer,
+ self.ref_code_path, self.in_dir)
+ result = get_class.evaluate()
+
+ self.assertTrue(result.get("success"))
+ self.assertEqual(result.get("error"), "Correct answer")
+
+ def test_error(self):
+ user_answer = "class Test {\n\tint square_num(int a) {\n\treturn a*a"
+ get_class = JavaCodeEvaluator(self.test_case_data, self.test,
+ self.language, user_answer,
+ self.ref_code_path, self.in_dir)
+ result = get_class.evaluate()
+
+ self.assertFalse(result.get("success"))
+ self.assertTrue("Error" in result.get("error"))
+
+ def test_infinite_loop(self):
+ user_answer = "class Test {\n\tint square_num(int a) {\n\t\twhile(0==0){\n\t\t}\n\t}\n}"
+ get_class = JavaCodeEvaluator(self.test_case_data, self.test,
+ self.language, user_answer,
+ self.ref_code_path, self.in_dir)
+ result = get_class.evaluate()
+
+ self.assertFalse(result.get("success"))
+ self.assertEquals(result.get("error"), self.timeout_msg)
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/yaksh/evaluator_tests/test_python_evaluation.py b/yaksh/evaluator_tests/test_python_evaluation.py
new file mode 100644
index 0000000..0478353
--- /dev/null
+++ b/yaksh/evaluator_tests/test_python_evaluation.py
@@ -0,0 +1,53 @@
+import unittest
+import os
+from yaksh.python_code_evaluator import PythonCodeEvaluator
+from yaksh.settings import SERVER_TIMEOUT
+
+class PythonEvaluationTestCases(unittest.TestCase):
+ def setUp(self):
+ self.language = "Python"
+ self.test = None
+ self.test_case_data = [{"func_name": "add",
+ "expected_answer": "5",
+ "test_id": u'null',
+ "pos_args": ["3", "2"],
+ "kw_args": {}
+ }]
+ self.timeout_msg = ("Code took more than {0} seconds to run. "
+ "You probably have an infinite loop in your code.").format(SERVER_TIMEOUT)
+
+ def test_correct_answer(self):
+ user_answer = "def add(a, b):\n\treturn a + b"""
+ get_class = PythonCodeEvaluator(self.test_case_data, self.test, self.language, user_answer, ref_code_path=None, in_dir=None)
+ result = get_class.evaluate()
+ self.assertTrue(result.get("success"))
+ self.assertEqual(result.get("error"), "Correct answer")
+
+ def test_incorrect_answer(self):
+ user_answer = "def add(a, b):\n\treturn a - b"
+ test_case_data = [{"func_name": "add",
+ "expected_answer": "5",
+ "test_id": u'null',
+ "pos_args": ["3", "2"],
+ "kw_args": {}
+ }]
+ get_class = PythonCodeEvaluator(self.test_case_data, self.test, self.language, user_answer, ref_code_path=None, in_dir=None)
+ result = get_class.evaluate()
+ self.assertFalse(result.get("success"))
+ self.assertEqual(result.get("error"), "AssertionError in: assert add(3, 2) == 5")
+
+ def test_infinite_loop(self):
+ user_answer = "def add(a, b):\n\twhile True:\n\t\tpass"""
+ test_case_data = [{"func_name": "add",
+ "expected_answer": "5",
+ "test_id": u'null',
+ "pos_args": ["3", "2"],
+ "kw_args": {}
+ }]
+ get_class = PythonCodeEvaluator(self.test_case_data, self.test, self.language, user_answer, ref_code_path=None, in_dir=None)
+ result = get_class.evaluate()
+ self.assertFalse(result.get("success"))
+ self.assertEquals(result.get("error"), self.timeout_msg)
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/yaksh/evaluator_tests/test_scilab_evaluation.py b/yaksh/evaluator_tests/test_scilab_evaluation.py
new file mode 100644
index 0000000..30af041
--- /dev/null
+++ b/yaksh/evaluator_tests/test_scilab_evaluation.py
@@ -0,0 +1,47 @@
+import unittest
+import os
+from yaksh.scilab_code_evaluator import ScilabCodeEvaluator
+from yaksh.settings import SERVER_TIMEOUT
+
+class ScilabEvaluationTestCases(unittest.TestCase):
+ def setUp(self):
+ self.language = "scilab"
+ self.ref_code_path = "scilab_files/test_add.sce"
+ self.in_dir = "/tmp"
+ self.test_case_data = []
+ self.timeout_msg = ("Code took more than {0} seconds to run. "
+ "You probably have an infinite loop in your code.").format(SERVER_TIMEOUT)
+ self.test = None
+
+ def test_correct_answer(self):
+ user_answer = "funcprot(0)\nfunction[c]=add(a,b)\n\tc=a+b;\nendfunction"
+ get_class = ScilabCodeEvaluator(self.test_case_data, self.test,
+ self.language, user_answer,
+ self.ref_code_path, self.in_dir)
+ result = get_class.evaluate()
+
+ self.assertTrue(result.get("success"))
+ self.assertEqual(result.get("error"), "Correct answer")
+
+ def test_error(self):
+ user_answer = "funcprot(0)\nfunction[c]=add(a,b)\n\tc=a+b;\ndis(\tendfunction"
+ get_class = ScilabCodeEvaluator(self.test_case_data, self.test,
+ self.language, user_answer,
+ self.ref_code_path, self.in_dir)
+ result = get_class.evaluate()
+
+ self.assertFalse(result.get("success"))
+ self.assertTrue("error" in result.get("error"))
+
+ def test_infinite_loop(self):
+ user_answer = "funcprot(0)\nfunction[c]=add(a,b)\n\tc=a;\nwhile(1==1)\nend\nendfunction"
+ get_class = ScilabCodeEvaluator(self.test_case_data, self.test,
+ self.language, user_answer,
+ self.ref_code_path, self.in_dir)
+ result = get_class.evaluate()
+
+ self.assertFalse(result.get("success"))
+ self.assertEquals(result.get("error"), self.timeout_msg)
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/yaksh/tests.py b/yaksh/tests.py
index 77ac56f..ce1e0e2 100644
--- a/yaksh/tests.py
+++ b/yaksh/tests.py
@@ -19,10 +19,11 @@ def setUpModule():
Question.objects.create(summary='Q%d' % (i), points=1)
# create a quiz
- Quiz.objects.create(start_date='2014-06-16', duration=30, active=False,
+ Quiz.objects.create(start_date_time=datetime.datetime(2015, 10, 9, 10, 8, 15, 0),
+ duration=30, active=False,
attempts_allowed=-1, time_between_attempts=0,
- description='demo quiz', pass_criteria=40,
- language='Python', prerequisite=None)
+ description='demo quiz', pass_criteria=40,
+ language='Python', prerequisite=None)
def tearDownModule():
@@ -51,10 +52,6 @@ class ProfileTestCases(unittest.TestCase):
class QuestionTestCases(unittest.TestCase):
def setUp(self):
# Single question details
- # self.question = Question(summary='Demo question', language='Python',
- # type='Code', active=True,
- # description='Write a function', points=1.0,
- # test='Test Cases', snippet='def myfunc()')
self.question = Question(summary='Demo question', language='Python',
type='Code', active=True,
description='Write a function', points=1.0,
@@ -130,8 +127,10 @@ class QuizTestCases(unittest.TestCase):
def test_quiz(self):
""" Test Quiz"""
- self.assertEqual((self.quiz.start_date).strftime('%Y-%m-%d'),
- '2014-06-16')
+ self.assertEqual((self.quiz.start_date_time).strftime('%Y-%m-%d'),
+ '2015-10-09')
+ self.assertEqual((self.quiz.start_date_time).strftime('%H:%M:%S'),
+ '10:08:15')
self.assertEqual(self.quiz.duration, 30)
self.assertTrue(self.quiz.active is False)
self.assertEqual(self.quiz.description, 'demo quiz')