Skip to content

Commit 5e47b0d

Browse files
Merge pull request #60 from ankitjavalkar/add-missing-tests
Add missing evaluator tests
2 parents 38812e1 + 5061c2a commit 5e47b0d

File tree

9 files changed

+307
-13
lines changed

9 files changed

+307
-13
lines changed

.travis.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ env:
99

1010
# command to install dependencies
1111
install:
12-
- "easy_install git+https://github.com/FOSSEE/online_test.git#egg=django_exam-0.1"
12+
- pip install git+https://github.com/FOSSEE/online_test.git#egg=yaksh-0.1
1313
- pip install -q Django==$DJANGO --use-mirrors
1414

1515
before_install:
1616
- sudo apt-get update -qq
1717
- sudo apt-get install -y scilab
1818

1919
# command to run tests
20-
script:
21-
- nosetests ./yaksh/tests/
22-
- python manage.py test
20+
script:
21+
- test $DJANGO=1.5.7 && nosetests ./yaksh/evaluator_tests/
22+
- python manage.py test yaksh

yaksh/evaluator_tests/__init__.py

Whitespace-only changes.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import unittest
2+
import os
3+
from yaksh.bash_code_evaluator import BashCodeEvaluator
4+
from yaksh.settings import SERVER_TIMEOUT
5+
6+
class BashEvaluationTestCases(unittest.TestCase):
7+
def setUp(self):
8+
self.language = "bash"
9+
self.ref_code_path = "bash_files/sample.sh,bash_files/sample.args"
10+
self.in_dir = "/tmp"
11+
self.test_case_data = []
12+
self.timeout_msg = ("Code took more than {0} seconds to run. "
13+
"You probably have an infinite loop in your code.").format(SERVER_TIMEOUT)
14+
self.test = None
15+
16+
def test_correct_answer(self):
17+
user_answer = "#!/bin/bash\n[[ $# -eq 2 ]] && echo $(( $1 + $2 )) && exit $(( $1 + $2 ))"
18+
get_class = BashCodeEvaluator(self.test_case_data, self.test, self.language, user_answer, self.ref_code_path, self.in_dir)
19+
result = get_class.evaluate()
20+
21+
self.assertTrue(result.get("success"))
22+
self.assertEqual(result.get("error"), "Correct answer")
23+
24+
def test_error(self):
25+
user_answer = "#!/bin/bash\n[[ $# -eq 2 ]] && echo $(( $1 - $2 )) && exit $(( $1 - $2 ))"
26+
get_class = BashCodeEvaluator(self.test_case_data, self.test, self.language, user_answer, self.ref_code_path, self.in_dir)
27+
result = get_class.evaluate()
28+
29+
self.assertFalse(result.get("success"))
30+
self.assertTrue("Error" in result.get("error"))
31+
32+
def test_infinite_loop(self):
33+
user_answer = "#!/bin/bash\nwhile [ 1 ] ; do echo "" > /dev/null ; done"
34+
get_class = BashCodeEvaluator(self.test_case_data, self.test, self.language, user_answer, self.ref_code_path, self.in_dir)
35+
result = get_class.evaluate()
36+
37+
self.assertFalse(result.get("success"))
38+
self.assertEquals(result.get("error"), self.timeout_msg)
39+
40+
if __name__ == '__main__':
41+
unittest.main()
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import unittest
2+
import os
3+
from yaksh.cpp_code_evaluator import CppCodeEvaluator
4+
from yaksh.settings import SERVER_TIMEOUT
5+
6+
class CEvaluationTestCases(unittest.TestCase):
7+
def setUp(self):
8+
self.language = "C"
9+
self.ref_code_path = "c_cpp_files/main.cpp"
10+
self.in_dir = "/tmp"
11+
self.test_case_data = []
12+
self.timeout_msg = ("Code took more than {0} seconds to run. "
13+
"You probably have an infinite loop in your code.").format(SERVER_TIMEOUT)
14+
self.test = None
15+
16+
def test_correct_answer(self):
17+
user_answer = "int add(int a, int b)\n{return a+b;}"
18+
get_class = CppCodeEvaluator(self.test_case_data, self.test, self.language, user_answer, self.ref_code_path, self.in_dir)
19+
result = get_class.evaluate()
20+
21+
self.assertTrue(result.get("success"))
22+
self.assertEqual(result.get("error"), "Correct answer")
23+
24+
def test_compilation_error(self):
25+
user_answer = "int add(int a, int b)\n{return a+b}"
26+
get_class = CppCodeEvaluator(self.test_case_data, self.test, self.language, user_answer, self.ref_code_path, self.in_dir)
27+
result = get_class.evaluate()
28+
29+
self.assertFalse(result.get("success"))
30+
self.assertTrue("Compilation Error" in result.get("error"))
31+
32+
def test_infinite_loop(self):
33+
user_answer = "int add(int a, int b)\n{while(1>0){}}"
34+
get_class = CppCodeEvaluator(self.test_case_data, self.test, self.language, user_answer, self.ref_code_path, self.in_dir)
35+
result = get_class.evaluate()
36+
37+
self.assertFalse(result.get("success"))
38+
self.assertEquals(result.get("error"), self.timeout_msg)
39+
40+
41+
###############################################################################
42+
class CppEvaluationTestCases(unittest.TestCase):
43+
def setUp(self):
44+
self.language = "CPP"
45+
self.ref_code_path = "c_cpp_files/main.cpp"
46+
self.in_dir = "/tmp"
47+
self.test_case_data = []
48+
self.timeout_msg = ("Code took more than {0} seconds to run. "
49+
"You probably have an infinite loop in your code.").format(SERVER_TIMEOUT)
50+
self.test = None
51+
52+
def test_correct_answer(self):
53+
user_answer = "int add(int a, int b)\n{return a+b;}"
54+
get_class = CppCodeEvaluator(self.test_case_data, self.test, self.language, user_answer, self.ref_code_path, self.in_dir)
55+
result = get_class.evaluate()
56+
57+
self.assertTrue(result.get("success"))
58+
self.assertEqual(result.get("error"), "Correct answer")
59+
60+
def test_compilation_error(self):
61+
user_answer = "int add(int a, int b)\n{return a+b}"
62+
get_class = CppCodeEvaluator(self.test_case_data, self.test, self.language, user_answer, self.ref_code_path, self.in_dir)
63+
result = get_class.evaluate()
64+
65+
self.assertFalse(result.get("success"))
66+
self.assertTrue("Compilation Error" in result.get("error"))
67+
68+
def test_infinite_loop(self):
69+
user_answer = "int add(int a, int b)\n{while(1>0){}}"
70+
get_class = CppCodeEvaluator(self.test_case_data, self.test, self.language, user_answer, self.ref_code_path, self.in_dir)
71+
result = get_class.evaluate()
72+
73+
self.assertFalse(result.get("success"))
74+
self.assertEquals(result.get("error"), self.timeout_msg)
75+
76+
if __name__ == '__main__':
77+
unittest.main()
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import unittest
2+
import os
3+
from yaksh import python_code_evaluator
4+
from yaksh.language_registry import _LanguageRegistry, set_registry, get_registry
5+
from yaksh.settings import SERVER_TIMEOUT
6+
7+
8+
class RegistryTestCase(unittest.TestCase):
9+
def setUp(self):
10+
set_registry()
11+
self.registry_object = get_registry()
12+
self.language_registry = _LanguageRegistry()
13+
14+
def test_set_register(self):
15+
class_name = getattr(python_code_evaluator, 'PythonCodeEvaluator')
16+
self.registry_object.register("python", "yaksh.python_code_evaluator.PythonCodeEvaluator")
17+
self.assertEquals(self.registry_object.get_class("python"), class_name)
18+
19+
def tearDown(self):
20+
self.registry_object = None
21+
22+
23+
if __name__ == '__main__':
24+
unittest.main()
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import unittest
2+
import os
3+
from yaksh import code_evaluator as evaluator
4+
from yaksh.java_code_evaluator import JavaCodeEvaluator
5+
6+
7+
class JavaEvaluationTestCases(unittest.TestCase):
8+
def setUp(self):
9+
self.language = "java"
10+
self.ref_code_path = "java_files/main_square.java"
11+
self.in_dir = "/tmp"
12+
self.test_case_data = []
13+
evaluator.SERVER_TIMEOUT = 9
14+
self.timeout_msg = ("Code took more than {0} seconds to run. "
15+
"You probably have an infinite loop in "
16+
"your code.").format(evaluator.SERVER_TIMEOUT)
17+
self.test = None
18+
19+
def tearDown(self):
20+
evaluator.SERVER_TIMEOUT = 2
21+
22+
def test_correct_answer(self):
23+
user_answer = "class Test {\n\tint square_num(int a) {\n\treturn a*a;\n\t}\n}"
24+
get_class = JavaCodeEvaluator(self.test_case_data, self.test,
25+
self.language, user_answer,
26+
self.ref_code_path, self.in_dir)
27+
result = get_class.evaluate()
28+
29+
self.assertTrue(result.get("success"))
30+
self.assertEqual(result.get("error"), "Correct answer")
31+
32+
def test_error(self):
33+
user_answer = "class Test {\n\tint square_num(int a) {\n\treturn a*a"
34+
get_class = JavaCodeEvaluator(self.test_case_data, self.test,
35+
self.language, user_answer,
36+
self.ref_code_path, self.in_dir)
37+
result = get_class.evaluate()
38+
39+
self.assertFalse(result.get("success"))
40+
self.assertTrue("Error" in result.get("error"))
41+
42+
def test_infinite_loop(self):
43+
user_answer = "class Test {\n\tint square_num(int a) {\n\t\twhile(0==0){\n\t\t}\n\t}\n}"
44+
get_class = JavaCodeEvaluator(self.test_case_data, self.test,
45+
self.language, user_answer,
46+
self.ref_code_path, self.in_dir)
47+
result = get_class.evaluate()
48+
49+
self.assertFalse(result.get("success"))
50+
self.assertEquals(result.get("error"), self.timeout_msg)
51+
52+
if __name__ == '__main__':
53+
unittest.main()
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import unittest
2+
import os
3+
from yaksh.python_code_evaluator import PythonCodeEvaluator
4+
from yaksh.settings import SERVER_TIMEOUT
5+
6+
class PythonEvaluationTestCases(unittest.TestCase):
7+
def setUp(self):
8+
self.language = "Python"
9+
self.test = None
10+
self.test_case_data = [{"func_name": "add",
11+
"expected_answer": "5",
12+
"test_id": u'null',
13+
"pos_args": ["3", "2"],
14+
"kw_args": {}
15+
}]
16+
self.timeout_msg = ("Code took more than {0} seconds to run. "
17+
"You probably have an infinite loop in your code.").format(SERVER_TIMEOUT)
18+
19+
def test_correct_answer(self):
20+
user_answer = "def add(a, b):\n\treturn a + b"""
21+
get_class = PythonCodeEvaluator(self.test_case_data, self.test, self.language, user_answer, ref_code_path=None, in_dir=None)
22+
result = get_class.evaluate()
23+
self.assertTrue(result.get("success"))
24+
self.assertEqual(result.get("error"), "Correct answer")
25+
26+
def test_incorrect_answer(self):
27+
user_answer = "def add(a, b):\n\treturn a - b"
28+
test_case_data = [{"func_name": "add",
29+
"expected_answer": "5",
30+
"test_id": u'null',
31+
"pos_args": ["3", "2"],
32+
"kw_args": {}
33+
}]
34+
get_class = PythonCodeEvaluator(self.test_case_data, self.test, self.language, user_answer, ref_code_path=None, in_dir=None)
35+
result = get_class.evaluate()
36+
self.assertFalse(result.get("success"))
37+
self.assertEqual(result.get("error"), "AssertionError in: assert add(3, 2) == 5")
38+
39+
def test_infinite_loop(self):
40+
user_answer = "def add(a, b):\n\twhile True:\n\t\tpass"""
41+
test_case_data = [{"func_name": "add",
42+
"expected_answer": "5",
43+
"test_id": u'null',
44+
"pos_args": ["3", "2"],
45+
"kw_args": {}
46+
}]
47+
get_class = PythonCodeEvaluator(self.test_case_data, self.test, self.language, user_answer, ref_code_path=None, in_dir=None)
48+
result = get_class.evaluate()
49+
self.assertFalse(result.get("success"))
50+
self.assertEquals(result.get("error"), self.timeout_msg)
51+
52+
if __name__ == '__main__':
53+
unittest.main()
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import unittest
2+
import os
3+
from yaksh.scilab_code_evaluator import ScilabCodeEvaluator
4+
from yaksh.settings import SERVER_TIMEOUT
5+
6+
class ScilabEvaluationTestCases(unittest.TestCase):
7+
def setUp(self):
8+
self.language = "scilab"
9+
self.ref_code_path = "scilab_files/test_add.sce"
10+
self.in_dir = "/tmp"
11+
self.test_case_data = []
12+
self.timeout_msg = ("Code took more than {0} seconds to run. "
13+
"You probably have an infinite loop in your code.").format(SERVER_TIMEOUT)
14+
self.test = None
15+
16+
def test_correct_answer(self):
17+
user_answer = "funcprot(0)\nfunction[c]=add(a,b)\n\tc=a+b;\nendfunction"
18+
get_class = ScilabCodeEvaluator(self.test_case_data, self.test,
19+
self.language, user_answer,
20+
self.ref_code_path, self.in_dir)
21+
result = get_class.evaluate()
22+
23+
self.assertTrue(result.get("success"))
24+
self.assertEqual(result.get("error"), "Correct answer")
25+
26+
def test_error(self):
27+
user_answer = "funcprot(0)\nfunction[c]=add(a,b)\n\tc=a+b;\ndis(\tendfunction"
28+
get_class = ScilabCodeEvaluator(self.test_case_data, self.test,
29+
self.language, user_answer,
30+
self.ref_code_path, self.in_dir)
31+
result = get_class.evaluate()
32+
33+
self.assertFalse(result.get("success"))
34+
self.assertTrue("error" in result.get("error"))
35+
36+
def test_infinite_loop(self):
37+
user_answer = "funcprot(0)\nfunction[c]=add(a,b)\n\tc=a;\nwhile(1==1)\nend\nendfunction"
38+
get_class = ScilabCodeEvaluator(self.test_case_data, self.test,
39+
self.language, user_answer,
40+
self.ref_code_path, self.in_dir)
41+
result = get_class.evaluate()
42+
43+
self.assertFalse(result.get("success"))
44+
self.assertEquals(result.get("error"), self.timeout_msg)
45+
46+
if __name__ == '__main__':
47+
unittest.main()

yaksh/tests.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@ def setUpModule():
1919
Question.objects.create(summary='Q%d' % (i), points=1)
2020

2121
# create a quiz
22-
Quiz.objects.create(start_date='2014-06-16', duration=30, active=False,
22+
Quiz.objects.create(start_date_time=datetime.datetime(2015, 10, 9, 10, 8, 15, 0),
23+
duration=30, active=False,
2324
attempts_allowed=-1, time_between_attempts=0,
24-
description='demo quiz', pass_criteria=40,
25-
language='Python', prerequisite=None)
25+
description='demo quiz', pass_criteria=40,
26+
language='Python', prerequisite=None)
2627

2728

2829
def tearDownModule():
@@ -51,10 +52,6 @@ def test_user_profile(self):
5152
class QuestionTestCases(unittest.TestCase):
5253
def setUp(self):
5354
# Single question details
54-
# self.question = Question(summary='Demo question', language='Python',
55-
# type='Code', active=True,
56-
# description='Write a function', points=1.0,
57-
# test='Test Cases', snippet='def myfunc()')
5855
self.question = Question(summary='Demo question', language='Python',
5956
type='Code', active=True,
6057
description='Write a function', points=1.0,
@@ -130,8 +127,10 @@ def setUp(self):
130127

131128
def test_quiz(self):
132129
""" Test Quiz"""
133-
self.assertEqual((self.quiz.start_date).strftime('%Y-%m-%d'),
134-
'2014-06-16')
130+
self.assertEqual((self.quiz.start_date_time).strftime('%Y-%m-%d'),
131+
'2015-10-09')
132+
self.assertEqual((self.quiz.start_date_time).strftime('%H:%M:%S'),
133+
'10:08:15')
135134
self.assertEqual(self.quiz.duration, 30)
136135
self.assertTrue(self.quiz.active is False)
137136
self.assertEqual(self.quiz.description, 'demo quiz')

0 commit comments

Comments
 (0)