Skip to content

Commit

Permalink
Merge pull request #60 from ankitjavalkar/add-missing-tests
Browse files Browse the repository at this point in the history
Add missing evaluator tests
  • Loading branch information
prabhuramachandran committed Oct 13, 2015
2 parents 38812e1 + 5061c2a commit 5e47b0d
Show file tree
Hide file tree
Showing 9 changed files with 307 additions and 13 deletions.
8 changes: 4 additions & 4 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ 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:
- sudo apt-get update -qq
- sudo apt-get install -y scilab

# command to run tests
script:
- nosetests ./yaksh/tests/
- python manage.py test
script:
- test $DJANGO=1.5.7 && nosetests ./yaksh/evaluator_tests/
- python manage.py test yaksh
Empty file.
41 changes: 41 additions & 0 deletions yaksh/evaluator_tests/test_bash_evaluation.py
Original file line number Diff line number Diff line change
@@ -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()
77 changes: 77 additions & 0 deletions yaksh/evaluator_tests/test_c_cpp_evaluation.py
Original file line number Diff line number Diff line change
@@ -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()
24 changes: 24 additions & 0 deletions yaksh/evaluator_tests/test_code_evaluation.py
Original file line number Diff line number Diff line change
@@ -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()
53 changes: 53 additions & 0 deletions yaksh/evaluator_tests/test_java_evaluation.py
Original file line number Diff line number Diff line change
@@ -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()
53 changes: 53 additions & 0 deletions yaksh/evaluator_tests/test_python_evaluation.py
Original file line number Diff line number Diff line change
@@ -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()
47 changes: 47 additions & 0 deletions yaksh/evaluator_tests/test_scilab_evaluation.py
Original file line number Diff line number Diff line change
@@ -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()
17 changes: 8 additions & 9 deletions yaksh/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -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():
Expand Down Expand Up @@ -51,10 +52,6 @@ def test_user_profile(self):
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,
Expand Down Expand Up @@ -130,8 +127,10 @@ def setUp(self):

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')
Expand Down

0 comments on commit 5e47b0d

Please sign in to comment.