Skip to content

Commit 8e1f1ce

Browse files
Merge pull request #10 from lambda-feedback/tr172-give-better-feedback-when-response-is-not-a-number
Added error message and feedback if answer or response is not a number
2 parents e9f384d + 47889ec commit 8e1f1ce

3 files changed

Lines changed: 51 additions & 3 deletions

File tree

app/docs/user.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
# IsSimilar
22

3-
Use this evaluation function to check if the student's reponse is within a tolerance range defined in `params`. Works exactly like the [numpy.isclose](https://numpy.org/doc/stable/reference/generated/numpy.isclose.html#numpy.isclose) function. Valid params include `atol` and `rtol` (absolute and relative tolerances) which can be used in combination, or alone.
3+
Use this evaluation function to check if the student's reponse is within a tolerance range defined in `params`. Works exactly like the [numpy.isclose](https://numpy.org/doc/stable/reference/generated/numpy.isclose.html#numpy.isclose) function. Valid params include `atol` and `rtol` (absolute and relative tolerances) which can be used in combination, or alone.
4+
5+
**Note:** If the answer is not a number, all responses will generate an error.
6+
7+
**Note:** If the response is not a number, a feedback message asking the user to submit a number will be returned.

app/evaluation.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,25 @@ def evaluation_function(response, answer, params) -> dict:
2727
is_correct = None
2828
real_diff = None
2929

30-
real_diff = abs(response - answer)
30+
if not (isinstance(answer, int) or isinstance(answer, float)):
31+
raise Exception("Answer must be a number.")
32+
33+
real_diff = None
3134
allowed_diff = atol + rtol * abs(answer)
3235
allowed_diff += spacing(answer)
33-
is_correct = bool(real_diff <= allowed_diff)
36+
is_correct = False
37+
feedback = ""
38+
if not (isinstance(response, int) or isinstance(response, float)):
39+
feedback = "Please enter a number."
40+
else:
41+
real_diff = abs(response - answer)
42+
allowed_diff = atol + rtol * abs(answer)
43+
allowed_diff += spacing(answer)
44+
is_correct = bool(real_diff <= allowed_diff)
3445

3546
return {
3647
"is_correct": is_correct,
3748
"real_diff": real_diff,
3849
"allowed_diff": allowed_diff,
50+
"feedback": feedback,
3951
}

app/evaluation_tests.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,5 +212,37 @@ def test_possible_bug_with_atol(self):
212212
self.assertEqual(result_under.get("is_correct"), False)
213213
self.assertEqual(result_over.get("is_correct"), False)
214214

215+
def test_answer_is_not_number(self):
216+
body = {
217+
"response": 2,
218+
"answer": "two",
219+
"params": {
220+
"rtol": 0.2
221+
},
222+
}
223+
224+
self.assertRaises(
225+
Exception,
226+
evaluation_function,
227+
body["response"],
228+
body["answer"],
229+
{},
230+
)
231+
232+
def test_response_is_not_number(self):
233+
body = {
234+
"response": "two",
235+
"answer": 2,
236+
"params": {
237+
"rtol": 0.2
238+
},
239+
}
240+
241+
response = evaluation_function(body['response'], body['answer'],
242+
body.get('params', {}))
243+
244+
self.assertEqual(response.get("is_correct"), False)
245+
self.assertEqual("Please enter a number." in response.get("feedback"), True)
246+
215247
if __name__ == "__main__":
216248
unittest.main()

0 commit comments

Comments
 (0)