def test_linear_too_few_comparisons(): FormulaGrader.set_default_comparer(LinearComparer()) grader = FormulaGrader(samples=2) with raises( ConfigError, match='Cannot perform linear comparison with less than 3 samples'): grader('1.5', '1.5') # Ensure that NumericalGrader does not use the same default comparer as FormulaGrader grader = NumericalGrader() assert grader('1.5', '1.5')['ok'] FormulaGrader.reset_default_comparer()
def test_default_comparer(): """Tests setting and resetting default_comparer""" def silly_comparer(comparer_params_eval, student_eval, utils): return utils.within_tolerance(1, student_eval) FormulaGrader.set_default_comparer(silly_comparer) silly_grader = FormulaGrader(answers='pi') FormulaGrader.reset_default_comparer() grader = FormulaGrader(answers='pi') silly_grader.config['answers'][0]['expect']['comparer'] is silly_comparer assert silly_grader(None, '1')['ok'] grader.config['answers'][0]['expect']['comparer'] is equality_comparer assert not grader(None, '1')['ok'] assert grader(None, '3.141592653')['ok']
def test_scaling_partial_credit(): FormulaGrader.set_default_comparer(LinearComparer()) grader = FormulaGrader(answers=('m*c^2', { 'expect': 'm*c^3', 'grade_decimal': 0.1 }), variables=['m', 'c']) FormulaGrader.reset_default_comparer() expected = { 'ok': 'partial', 'grade_decimal': 0.1 * 0.5, # This message is a bit awkward ... in this situation, probably better to set up # a different LinearComparer for the common wrong answers, if you want to do that. # Or only use an linear comparer for the correct answer, and use equality_compaer # for the common wrong answers. # Anyway, I'm just testing the partial credit scaling 'msg': 'The submitted answer differs from an expected answer by a constant factor.', } assert grader(None, '4*m*c^3') == expected