Skip to content

Commit 29ec8a6

Browse files
authored
Merge pull request #6255 from rtibblesbot/issue-6232-5dc08b
Drop non-finite numeric answers from Perseus input questions
2 parents 3f3fabc + c8b509c commit 29ec8a6

2 files changed

Lines changed: 44 additions & 4 deletions

File tree

‎contentcuration/contentcuration/tests/utils/test_exercise_creation.py‎

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,45 @@ def test_formula_processing(self):
754754
)
755755
self.assertIn("$\\frac{x}{2} = 3$", item_json["question"]["content"])
756756

757+
def _numeric_answer_values(self, answers):
758+
item = self._create_assessment_item(
759+
exercises.INPUT_QUESTION,
760+
"What is the answer?",
761+
[
762+
{"answer": answer, "correct": True, "order": order}
763+
for order, answer in enumerate(answers, start=1)
764+
],
765+
)
766+
self._create_perseus_zip(
767+
{
768+
"mastery_model": exercises.M_OF_N,
769+
"randomize": True,
770+
"n": 1,
771+
"m": 1,
772+
"all_assessment_items": [item.assessment_id],
773+
"assessment_mapping": {item.assessment_id: exercises.INPUT_QUESTION},
774+
}
775+
)
776+
exercise_file = self.exercise_node.files.get(preset_id=format_presets.EXERCISE)
777+
zip_file, _ = self._validate_perseus_zip(exercise_file)
778+
item_json = json.loads(
779+
zip_file.read(f"{item.assessment_id}.json").decode("utf-8")
780+
)
781+
options = item_json["question"]["widgets"]["numeric-input 1"]["options"]
782+
return [answer["value"] for answer in options["answers"]]
783+
784+
def test_input_question_drops_non_finite_answers(self):
785+
values = self._numeric_answer_values(
786+
[
787+
"6",
788+
"1e400",
789+
"-1e400",
790+
"1" * 401,
791+
"1" * 401 + "/" + "1" * 401,
792+
]
793+
)
794+
self.assertEqual(values, [6.0])
795+
757796
def test_multiple_formula_processing(self):
758797
"""Test that formulas are properly processed in exercises"""
759798
# Create a question with LaTeX formulas

‎contentcuration/contentcuration/utils/assessment/perseus.py‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import copy
22
import json
3+
import math
34
import re
45
import zipfile
56

@@ -79,13 +80,13 @@ def process_assessment_item(self, assessment_item):
7980

8081
def _process_input_answers(self, processed_data):
8182
"""Extract input answer processing logic"""
82-
non_empty_answers = []
83+
numeric_answers = []
8384
for answer in processed_data["answers"]:
8485
answer["answer"] = extract_value(answer["answer"])
85-
if answer["answer"] or answer["answer"] == 0:
86-
non_empty_answers.append(answer)
86+
if answer["answer"] is not None and math.isfinite(answer["answer"]):
87+
numeric_answers.append(answer)
8788

88-
return {**processed_data, "answers": non_empty_answers}
89+
return {**processed_data, "answers": numeric_answers}
8990

9091
def create_assessment_item(self, assessment_item, processed_data):
9192
template = self.TEMPLATE_MAP.get(assessment_item.type)

0 commit comments

Comments
 (0)