def test_python(): """Test if server runs Python code as expected.""" src = 'while True: pass' result = code_server.run_code(src, '', '/tmp', language="python") check_result(result, 'more than ') src = 'x = 1' result = code_server.run_code(src, 'assert x == 1', '/tmp', language="python") check_result(result, 'correct answer') result = code_server.run_code(src, 'assert x == 0', '/tmp', language="python") check_result(result, 'assertionerror') src = 'abracadabra' result = code_server.run_code(src, 'assert x == 0', '/tmp', language="python") check_result(result, 'nameerror')
def test_bash(): """Test if server runs Bash code as expected.""" src = """ #!/bin/bash [[ $# -eq 2 ]] && echo $(( $1 + $2 )) && exit $(( $1 + $2 )) """ result = code_server.run_code(src, 'docs/sample.sh\ndocs/sample.args', '/tmp', language="bash") check_result(result) src = """ #!/bin/bash [[ $# -eq 2 ]] && echo $(( $1 - $2 )) && exit $(( $1 - $2 )) """ result = code_server.run_code(src, 'docs/sample.sh\ndocs/sample.args', '/tmp', language="bash") check_result(result, 'error') src = """\ #!/bin/bash while [ 1 ] ; do echo "" > /dev/null ; done """ result = code_server.run_code(src, 'docs/sample.sh\ndocs/sample.args', '/tmp', language="bash") check_result(result, 'more than ') src = ''' #!/bin/bash while [ 1 ] ; do echo "" > /dev/null ''' result = code_server.run_code(src, 'docs/sample.sh\ndocs/sample.args', '/tmp', language="bash") check_result(result, 'error') src = '''# Enter your code here. #!/bin/bash while [ 1 ] ; do echo "" > /dev/null ''' result = code_server.run_code(src, 'docs/sample.sh\ndocs/sample.args', '/tmp', language="bash") check_result(result, 'oserror')
def validate_answer(user, user_answer, question): """ Checks whether the answer submitted by the user is right or wrong. If right then returns correct = True, success and message = Correct answer. success is True for MCQ's and multiple correct choices because only one attempt are allowed for them. For code questions success is True only if the answer is correct. """ success = True correct = False message = 'Incorrect answer' if user_answer is not None: if question.type == 'mcq': if user_answer.strip() == question.test.strip(): correct = True message = 'Correct answer' elif question.type == 'mcc': answers = set(question.test.splitlines()) if set(user_answer) == answers: correct = True message = 'Correct answer' elif question.type == 'code': user_dir = get_user_dir(user) success, message = code_server.run_code(user_answer, question.test, user_dir, question.language) if success: correct = True return correct, success, message
def check(request, q_id): user = request.user if not user.is_authenticated(): return my_redirect('/exam/login/') question = get_object_or_404(Question, pk=q_id) paper = QuestionPaper.objects.get(user=user, quiz__active=True) answer = request.POST.get('answer') skip = request.POST.get('skip', None) if skip is not None: next_q = paper.skip() return show_question(request, next_q) # Add the answer submitted, regardless of it being correct or not. new_answer = Answer(question=question, answer=answer, correct=False) new_answer.save() paper.answers.add(new_answer) # If we were not skipped, we were asked to check. For any non-mcq # questions, we obtain the results via XML-RPC with the code executed # safely in a separate process (the code_server.py) running as nobody. if question.type == 'mcq': success = True # Only one attempt allowed for MCQ's. if answer.strip() == question.test.strip(): new_answer.correct = True new_answer.marks = question.points new_answer.error = 'Correct answer' else: new_answer.error = 'Incorrect answer' else: user_dir = get_user_dir(user) success, err_msg = code_server.run_code(answer, question.test, user_dir, question.type) new_answer.error = err_msg if success: # Note the success and save it along with the marks. new_answer.correct = success new_answer.marks = question.points new_answer.save() if not success: # Should only happen for non-mcq questions. time_left = paper.time_left() if time_left == 0: return complete(request, reason='Your time is up!') if not paper.quiz.active: return complete(request, reason='The quiz has been deactivated!') context = {'question': question, 'error_message': err_msg, 'paper': paper, 'last_attempt': answer, 'quiz_name': paper.quiz.description, 'time_left': time_left} ci = RequestContext(request) return my_render_to_response('exam/question.html', context, context_instance=ci) else: next_q = paper.completed_question(question.id) return show_question(request, next_q)
def test_c(): """Test if server runs c code as expected.""" src = """ #include<stdiol.h> int ad(int a, int b) {return a+b;} """ result = code_server.run_code(src, 'c_cpp_files/main.cpp', '/tmp', language="C") check_result(result, 'error') src = """ int add(int a, int b) {return a+b} """ result = code_server.run_code(src, 'c_cpp_files/main.cpp', '/tmp', language="C") check_result(result, 'compilation error') src = """ int add(int a, int b) {while(1>0){} return a+b;} """ result = code_server.run_code(src, 'c_cpp_files/main.cpp', '/tmp', language="C") check_result(result, 'more than') src = """ int add(int a, int b) {return a+b;} """ result = code_server.run_code(src, 'c_cpp_files/main.cpp', '/tmp', language="C") check_result(result, 'correct answer') src = """ #include<stdio.h> int add(int a, int b) {printf("All Correct");} """ result = code_server.run_code(src, 'c_cpp_files/main.cpp', '/tmp', language="C") check_result(result, 'incorrect')
def test_scilab(): """Test if server runs scilab code as expected.""" src = """ funcprot(0) function[c]=add(a,b) c=a+b; endfunction """ result = code_server.run_code(src, 'scilab_files/test_add.sce', '/tmp', language="scilab") check_result(result, 'correct answer') src = """ funcprot(0) function[c]=add(a,b) c=a-b; endfunction """ result = code_server.run_code(src, 'scilab_files/test_add.sce', '/tmp', language="scilab") check_result(result, 'correct answer') src = """ funcprot(0) function[c]=add(a,b) c=a+b; dis( endfunction """ result = code_server.run_code(src, 'scilab_files/test_add.sce', '/tmp', language="scilab") check_result(result, 'error') src = """ funcprot(0) function[c]=add(a,b) c=a while(1==1) end endfunction """ result = code_server.run_code(src, 'scilab_files/test_add.sce', '/tmp', language="scilab") check_result(result, 'error')
def test_cpp(): """Test if server runs c code as expected.""" src = """ int add(int a, int b) { return a+b } """ result = code_server.run_code(src, 'c_cpp_files/main.cpp', '/tmp', language="C++") check_result(result, 'error') src = """ int add(int a, int b) { return a+b; } """ result = code_server.run_code(src, 'c_cpp_files/main.cpp', '/tmp', language="C++") check_result(result, 'correct answer') src = """ int dd(int a, int b) { return a+b; } """ result = code_server.run_code(src, 'c_cpp_files/main.cpp', '/tmp', language="C++") check_result(result, 'error') src = """ int add(int a, int b) { while(0==0) {} return a+b; } """ result = code_server.run_code(src, 'c_cpp_files/main.cpp', '/tmp', language="C++") check_result(result, 'more than')
def test_java(): """Test if server runs java code as expected.""" src = """ class Test { int square_num(int a) { return a*a; } } """ result = code_server.run_code(src, 'java_files/main_square.java', '/tmp', language="java") check_result(result, 'correct answer') src = """ class Test { int square_num(int a) { return b*b; } } """ result = code_server.run_code(src, 'java_files/main_square.java', '/tmp', language="java") check_result(result, 'error') src = """ class Test { int square_nu(int a) { return a*a; } } """ result = code_server.run_code(src, 'java_files/main_square.java', '/tmp', language="java") check_result(result, 'error') src = """ class Test { int square_num(int a) { while(0==0) {} } } """ result = code_server.run_code(src, 'java_files/main_square.java', '/tmp', language="java") check_result(result, 'more than') src = """ class Test { int square_num(int a) { return a+b } } """ result = code_server.run_code(src, 'java_files/main_square.java', '/tmp', language="java") check_result(result, 'error') src = """ class Test { int square_num(int a) { return a+b """ result = code_server.run_code(src, 'java_files/main_square.java', '/tmp', language="java") check_result(result, 'error')
def check(request, q_id): user = request.user if not user.is_authenticated(): return my_redirect("/exam/login/") question = get_object_or_404(Question, pk=q_id) paper = QuestionPaper.objects.get(user=user, quiz__active=True) answer = request.POST.get("answer") skip = request.POST.get("skip", None) if skip is not None: next_q = paper.skip() return show_question(request, next_q) # Add the answer submitted, regardless of it being correct or not. new_answer = Answer(question=question, answer=answer, correct=False) new_answer.save() paper.answers.add(new_answer) # If we were not skipped, we were asked to check. For any non-mcq # questions, we obtain the results via XML-RPC with the code executed # safely in a separate process (the code_server.py) running as nobody. if question.type == "mcq": success = True # Only one attempt allowed for MCQ's. if answer.strip() == question.test.strip(): new_answer.correct = True new_answer.marks = question.points new_answer.error = "Correct answer" else: new_answer.error = "Incorrect answer" else: user_dir = get_user_dir(user) success, err_msg = code_server.run_code(answer, question.test, user_dir, question.type) new_answer.error = err_msg if success: # Note the success and save it along with the marks. new_answer.correct = success new_answer.marks = question.points new_answer.save() if not success: # Should only happen for non-mcq questions. time_left = paper.time_left() if time_left == 0: return complete(request, reason="Your time is up!") if not paper.quiz.active: return complete(request, reason="The quiz has been deactivated!") context = { "question": question, "error_message": err_msg, "paper": paper, "last_attempt": answer, "quiz_name": paper.quiz.description, "time_left": time_left, } ci = RequestContext(request) return my_render_to_response("exam/question.html", context, context_instance=ci) else: next_q = paper.completed_question(question.id) return show_question(request, next_q)