MDL-29758 make Cloze question feedback display more informative

as it was in Moodle 1.9
This commit is contained in:
Jean-Michel Vedrine
2013-05-09 07:55:43 +02:00
parent 95190fda69
commit d56ab3b992
3 changed files with 153 additions and 8 deletions
+10 -1
View File
@@ -70,10 +70,19 @@ class qbehaviour_adaptive extends question_behaviour_with_save {
}
public function adjust_display_options(question_display_options $options) {
// Save some bits so we can put them back later.
$save = clone($options);
// Do the default thing.
parent::adjust_display_options($options);
// Then, if they have just Checked an answer, show them the applicable bits of feedback.
if (!$this->qa->get_state()->is_finished() &&
$this->qa->get_last_behaviour_var('_try')) {
$options->feedback = true;
$options->feedback = $save->feedback;
$options->correctness = $save->correctness;
$options->numpartscorrect = $save->numpartscorrect;
}
}
@@ -238,13 +238,17 @@ class qbehaviour_adaptive_walkthrough_test extends qbehaviour_walkthrough_test_b
public function test_adaptive_shortanswer_partially_right() {
// Create a short answer question
// Create a short answer question.
$sa = test_question_maker::make_question('shortanswer');
$this->start_attempt_at_question($sa, 'adaptive');
// Check the initial state.
$this->check_current_state(question_state::$todo);
$this->check_current_mark(null);
$this->render();
$this->check_output_does_not_contain_text_input_with_class('answer', 'correct');
$this->check_output_does_not_contain_text_input_with_class('answer', 'partiallycorrect');
$this->check_output_does_not_contain_text_input_with_class('answer', 'incorrect');
$this->check_current_output(
$this->get_contains_marked_out_of_summary(),
$this->get_contains_submit_button_expectation(true),
@@ -256,6 +260,8 @@ class qbehaviour_adaptive_walkthrough_test extends qbehaviour_walkthrough_test_b
// Verify.
$this->check_current_state(question_state::$todo);
$this->check_current_mark(0.8);
$this->render();
$this->check_output_contains_text_input_with_class('answer', 'partiallycorrect');
$this->check_current_output(
$this->get_contains_mark_summary(0.8),
$this->get_contains_submit_button_expectation(true),
@@ -270,6 +276,8 @@ class qbehaviour_adaptive_walkthrough_test extends qbehaviour_walkthrough_test_b
// Verify.
$this->check_current_state(question_state::$todo);
$this->check_current_mark(0.8);
$this->render();
$this->check_output_contains_text_input_with_class('answer', 'incorrect');
$this->check_current_output(
$this->get_contains_mark_summary(0.8),
$this->get_contains_submit_button_expectation(true),
@@ -284,6 +292,8 @@ class qbehaviour_adaptive_walkthrough_test extends qbehaviour_walkthrough_test_b
// Verify.
$this->check_current_state(question_state::$complete);
$this->check_current_mark(0.8);
$this->render();
$this->check_output_contains_text_input_with_class('answer', 'correct');
$this->check_current_output(
$this->get_contains_mark_summary(0.8),
$this->get_contains_submit_button_expectation(true),
@@ -307,7 +317,7 @@ class qbehaviour_adaptive_walkthrough_test extends qbehaviour_walkthrough_test_b
public function test_adaptive_shortanswer_wrong_right_wrong() {
// Create a short answer question
// Create a short answer question.
$sa = test_question_maker::make_question('shortanswer');
$this->start_attempt_at_question($sa, 'adaptive', 6);
@@ -390,7 +400,7 @@ class qbehaviour_adaptive_walkthrough_test extends qbehaviour_walkthrough_test_b
public function test_adaptive_shortanswer_invalid_after_complete() {
// Create a short answer question
// Create a short answer question.
$sa = test_question_maker::make_question('shortanswer');
$this->start_attempt_at_question($sa, 'adaptive');
@@ -472,9 +482,9 @@ class qbehaviour_adaptive_walkthrough_test extends qbehaviour_walkthrough_test_b
public function test_adaptive_shortanswer_zero_penalty() {
// Create a short answer question
// Create a short answer question.
$sa = test_question_maker::make_question('shortanswer');
// Disable penalties for this question
// Disable penalties for this question.
$sa->penalty = 0;
$this->start_attempt_at_question($sa, 'adaptive');
@@ -588,7 +598,7 @@ class qbehaviour_adaptive_walkthrough_test extends qbehaviour_walkthrough_test_b
public function test_adaptive_numerical() {
// Create a numerical question
// Create a numerical question.
$sa = test_question_maker::make_question('numerical', 'pi');
$this->start_attempt_at_question($sa, 'adaptive');
@@ -643,7 +653,7 @@ class qbehaviour_adaptive_walkthrough_test extends qbehaviour_walkthrough_test_b
public function test_adaptive_numerical_invalid() {
// Create a numerical question
// Create a numerical question.
$numq = test_question_maker::make_question('numerical', 'pi');
$numq->penalty = 0.1;
$this->start_attempt_at_question($numq, 'adaptive');
@@ -744,4 +754,102 @@ class qbehaviour_adaptive_walkthrough_test extends qbehaviour_walkthrough_test_b
$this->get_does_not_contain_validation_error_expectation(),
$this->get_does_not_contain_disregarded_info_expectation());
}
public function test_adaptive_multianswer() {
// Create a multianswer question.
$q = test_question_maker::make_question('multianswer', 'twosubq');
// To simplify testing, multichoice subquestion's answers are not shuffled.
$q->subquestions[2]->shuffleanswers = 0;
$choices = array('' => '', '0' => 'Bow-wow', '1' => 'Wiggly worm', '2' => 'Pussy-cat');
$this->start_attempt_at_question($q, 'adaptive', 12);
// Check the initial state.
$this->check_current_state(question_state::$todo);
$this->check_current_mark(null);
$this->assertEquals('adaptive',
$this->quba->get_question_attempt($this->slot)->get_behaviour_name());
$this->render();
$this->check_output_contains_text_input('sub1_answer', '', true);
$this->check_output_does_not_contain_text_input_with_class('sub1_answer', 'correct');
$this->check_output_does_not_contain_text_input_with_class('sub1_answer', 'partiallycorrect');
$this->check_output_does_not_contain_text_input_with_class('sub1_answer', 'incorrect');
$this->check_current_output(
$this->get_contains_marked_out_of_summary(),
$this->get_contains_select_expectation('sub2_answer', $choices, null, true),
$this->get_contains_submit_button_expectation(true),
$this->get_does_not_contain_validation_error_expectation(),
$this->get_does_not_contain_feedback_expectation());
// Submit an invalid response.
$this->process_submission(array('sub1_answer' => '', 'sub2_answer' => 1, '-submit' => 1));
// Verify.
$this->check_current_state(question_state::$invalid);
$this->check_current_mark(null);
$this->check_output_contains_text_input('sub1_answer', '', true);
$this->check_current_output(
$this->get_contains_select_expectation('sub2_answer', $choices, 1, true),
$this->get_contains_submit_button_expectation(true),
$this->get_does_not_contain_penalty_info_expectation(),
$this->get_does_not_contain_total_penalty_expectation(),
$this->get_contains_disregarded_info_expectation());
// Check that extract responses will return the reset data.
$prefix = $this->quba->get_field_prefix($this->slot);
$this->assertEquals(array('sub2_answer' => 1),
$this->quba->extract_responses($this->slot, array($prefix . 'sub2_answer' => 1)));
// Submit an incorrect response.
$this->process_submission(array('sub1_answer' => 'Dog',
'sub2_answer' => 1, '-submit' => 1));
// Verify.
$this->check_current_state(question_state::$todo);
$this->check_current_mark(0);
$this->render();
$this->check_output_contains_text_input('sub1_answer', 'Dog', true);
$this->check_output_contains_text_input_with_class('sub1_answer', 'incorrect');
$this->check_current_output(
$this->get_contains_mark_summary(0),
$this->get_contains_select_expectation('sub2_answer', $choices, 1, true),
$this->get_contains_submit_button_expectation(true),
$this->get_contains_incorrect_expectation(),
$this->get_contains_penalty_info_expectation(4.00),
$this->get_does_not_contain_validation_error_expectation());
// Submit the right answer.
$this->process_submission(array('sub1_answer' => 'Owl', 'sub2_answer' => 2, '-submit' => 1));
// Verify.
$this->check_current_state(question_state::$complete);
$this->check_current_mark(8.00);
$this->render();
$this->check_output_contains_text_input('sub1_answer', 'Owl', true);
$this->check_output_contains_text_input_with_class('sub1_answer', 'correct');
$this->check_current_output(
$this->get_contains_select_expectation('sub2_answer', $choices, '2', true),
$this->get_contains_mark_summary(8.00),
$this->get_contains_submit_button_expectation(true),
$this->get_contains_correct_expectation(),
$this->get_does_not_contain_penalty_info_expectation(),
$this->get_does_not_contain_total_penalty_expectation(),
$this->get_does_not_contain_validation_error_expectation());
// Finish the attempt.
$this->quba->finish_all_questions();
// Verify.
$this->check_current_state(question_state::$gradedright);
$this->check_current_mark(8.00);
$this->render();
$this->check_output_contains_text_input('sub1_answer', 'Owl', false);
$this->check_output_contains_text_input_with_class('sub1_answer', 'correct');
$this->check_current_output(
$this->get_contains_mark_summary(8.00),
$this->get_contains_submit_button_expectation(false),
$this->get_contains_correct_expectation(),
$this->get_does_not_contain_validation_error_expectation());
}
}
+28
View File
@@ -786,6 +786,34 @@ abstract class qbehaviour_walkthrough_test_base extends question_testcase {
}
}
protected function check_output_contains_text_input_with_class($name, $class = null) {
$attributes = array(
'type' => 'text',
'name' => $this->quba->get_field_prefix($this->slot) . $name,
);
if (!is_null($class)) {
$attributes['class'] = 'regexp:/\b' . $class . '\b/';
}
$matcher = $this->get_tag_matcher('input', $attributes);
$this->assertTag($matcher, $this->currentoutput,
'Looking for an input with attributes ' . html_writer::attributes($attributes) . ' in ' . $this->currentoutput);
}
protected function check_output_does_not_contain_text_input_with_class($name, $class = null) {
$attributes = array(
'type' => 'text',
'name' => $this->quba->get_field_prefix($this->slot) . $name,
);
if (!is_null($class)) {
$attributes['class'] = 'regexp:/\b' . $class . '\b/';
}
$matcher = $this->get_tag_matcher('input', $attributes);
$this->assertNotTag($matcher, $this->currentoutput,
'Unexpected input with attributes ' . html_writer::attributes($attributes) . ' found in ' . $this->currentoutput);
}
protected function check_output_contains_hidden_input($name, $value) {
$attributes = array(
'type' => 'hidden',