diff --git a/question/behaviour/adaptive/tests/walkthrough_test.php b/question/behaviour/adaptive/tests/walkthrough_test.php index b78e4706106..60474a31f9b 100644 --- a/question/behaviour/adaptive/tests/walkthrough_test.php +++ b/question/behaviour/adaptive/tests/walkthrough_test.php @@ -43,35 +43,35 @@ class qbehaviour_adaptive_walkthrough_test extends qbehaviour_walkthrough_test_b protected function get_contains_penalty_info_expectation($penalty) { $penaltyinfo = get_string('gradingdetailspenalty', 'qbehaviour_adaptive', format_float($penalty, $this->displayoptions->markdp)); - return new question_pattern_expectation('/'.preg_quote($penaltyinfo).'/'); + return new question_pattern_expectation('/'.preg_quote($penaltyinfo, '/').'/'); } protected function get_does_not_contain_penalty_info_expectation() { $penaltyinfo = get_string('gradingdetailspenalty', 'qbehaviour_adaptive', 'XXXXX'); - $penaltypattern = '/'.str_replace('XXXXX', '\\w*', preg_quote($penaltyinfo)).'/'; + $penaltypattern = '/'.str_replace('XXXXX', '\\w*', preg_quote($penaltyinfo, '/')).'/'; return new question_no_pattern_expectation($penaltypattern); } protected function get_contains_total_penalty_expectation($penalty) { $penaltyinfo = get_string('gradingdetailspenaltytotal', 'qbehaviour_adaptive', format_float($penalty, $this->displayoptions->markdp)); - return new question_pattern_expectation('/'.preg_quote($penaltyinfo).'/'); + return new question_pattern_expectation('/'.preg_quote($penaltyinfo, '/').'/'); } protected function get_does_not_contain_total_penalty_expectation() { $penaltyinfo = get_string('gradingdetailspenaltytotal', 'qbehaviour_adaptive', 'XXXXX'); - $penaltypattern = '/'.str_replace('XXXXX', '\\w*', preg_quote($penaltyinfo)).'/'; + $penaltypattern = '/'.str_replace('XXXXX', '\\w*', preg_quote($penaltyinfo, '/')).'/'; return new question_no_pattern_expectation($penaltypattern); } protected function get_contains_disregarded_info_expectation() { $penaltyinfo = get_string('disregardedwithoutpenalty', 'qbehaviour_adaptive'); - return new question_pattern_expectation('/'.preg_quote($penaltyinfo).'/'); + return new question_pattern_expectation('/'.preg_quote($penaltyinfo, '/').'/'); } protected function get_does_not_contain_disregarded_info_expectation() { $penaltyinfo = get_string('disregardedwithoutpenalty', 'qbehaviour_adaptive'); - return new question_no_pattern_expectation('/'.preg_quote($penaltyinfo).'/'); + return new question_no_pattern_expectation('/'.preg_quote($penaltyinfo, '/').'/'); } public function test_adaptive_multichoice() { @@ -165,7 +165,7 @@ class qbehaviour_adaptive_walkthrough_test extends qbehaviour_walkthrough_test_b $this->check_current_mark(1); $this->check_current_output( $this->get_contains_mark_summary(1), - new question_pattern_expectation('/' . preg_quote('Not good enough!') . '/')); + new question_pattern_expectation('/' . preg_quote('Not good enough!', '/') . '/')); // Now change the correct answer to the question, and regrade. $mc->answers[13]->fraction = -0.33333333; diff --git a/question/behaviour/adaptivenopenalty/tests/walkthrough_test.php b/question/behaviour/adaptivenopenalty/tests/walkthrough_test.php index 546a5b5caa4..b44f6e3a211 100644 --- a/question/behaviour/adaptivenopenalty/tests/walkthrough_test.php +++ b/question/behaviour/adaptivenopenalty/tests/walkthrough_test.php @@ -131,7 +131,7 @@ class qbehaviour_adaptivenopenalty_walkthrough_test extends qbehaviour_walkthrou $this->check_current_mark(1); $this->check_current_output( $this->get_contains_mark_summary(1), - new question_pattern_expectation('/' . preg_quote('Not good enough!') . '/')); + new question_pattern_expectation('/' . preg_quote('Not good enough!', '/') . '/')); // Now change the correct answer to the question, and regrade. $mc->answers[13]->fraction = -0.33333333; diff --git a/question/behaviour/deferredcbm/tests/walkthrough_test.php b/question/behaviour/deferredcbm/tests/walkthrough_test.php index 852b0680d51..69b7cd13333 100644 --- a/question/behaviour/deferredcbm/tests/walkthrough_test.php +++ b/question/behaviour/deferredcbm/tests/walkthrough_test.php @@ -101,7 +101,7 @@ class qbehaviour_deferredcbm_walkthrough_test extends qbehaviour_walkthrough_tes $this->check_current_state(question_state::$mangrpartial); $this->check_current_mark(1); $this->check_current_output(new question_pattern_expectation('/' . - preg_quote('Not good enough!') . '/')); + preg_quote('Not good enough!', '/') . '/')); // Now change the correct answer to the question, and regrade. $tf->rightanswer = false; @@ -178,7 +178,7 @@ class qbehaviour_deferredcbm_walkthrough_test extends qbehaviour_walkthrough_tes new question_pattern_expectation('/' . preg_quote( get_string('assumingcertainty', 'qbehaviour_deferredcbm', question_cbm::get_string( - $qa->get_last_behaviour_var('_assumedcertainty')))) . '/')); + $qa->get_last_behaviour_var('_assumedcertainty'))), '/') . '/')); $this->assertEquals(get_string('true', 'qtype_truefalse'), $this->quba->get_response_summary($this->slot)); } @@ -204,9 +204,9 @@ class qbehaviour_deferredcbm_walkthrough_test extends qbehaviour_walkthrough_tes $this->get_contains_incorrect_expectation()); $this->assertEquals('A [' . question_cbm::get_string(question_cbm::HIGH) . ']', $this->quba->get_right_answer_summary($this->slot)); - $this->assertRegExp('/' . preg_quote($mc->questiontext) . '/', + $this->assertRegExp('/' . preg_quote($mc->questiontext, '/') . '/', $this->quba->get_question_summary($this->slot)); - $this->assertRegExp('/(B|C) \[' . preg_quote(question_cbm::get_string(2)) . '\]/', + $this->assertRegExp('/(B|C) \[' . preg_quote(question_cbm::get_string(2), '/') . '\]/', $this->quba->get_response_summary($this->slot)); // Save the old attempt. @@ -228,7 +228,7 @@ class qbehaviour_deferredcbm_walkthrough_test extends qbehaviour_walkthrough_tes $this->get_does_not_contain_correctness_expectation()); $this->assertEquals('A [' . question_cbm::get_string(question_cbm::HIGH) . ']', $this->quba->get_right_answer_summary($this->slot)); - $this->assertRegExp('/' . preg_quote($mc->questiontext) . '/', + $this->assertRegExp('/' . preg_quote($mc->questiontext, '/') . '/', $this->quba->get_question_summary($this->slot)); $this->assertNull($this->quba->get_response_summary($this->slot)); @@ -243,7 +243,7 @@ class qbehaviour_deferredcbm_walkthrough_test extends qbehaviour_walkthrough_tes $this->get_contains_mc_radio_expectation($rightindex, false, true), $this->get_contains_cbm_radio_expectation(3, false, true), $this->get_contains_correct_expectation()); - $this->assertRegExp('/(A) \[' . preg_quote(question_cbm::get_string(3)) . '\]/', + $this->assertRegExp('/(A) \[' . preg_quote(question_cbm::get_string(3), '/') . '\]/', $this->quba->get_response_summary($this->slot)); } diff --git a/question/behaviour/deferredfeedback/tests/walkthrough_test.php b/question/behaviour/deferredfeedback/tests/walkthrough_test.php index 80faf0c82ba..45c6c9ac80f 100644 --- a/question/behaviour/deferredfeedback/tests/walkthrough_test.php +++ b/question/behaviour/deferredfeedback/tests/walkthrough_test.php @@ -52,7 +52,7 @@ class qbehaviour_deferredfeedback_walkthrough_test extends qbehaviour_walkthroug $this->get_does_not_contain_feedback_expectation()); $this->assertEquals(get_string('true', 'qtype_truefalse'), $this->quba->get_right_answer_summary($this->slot)); - $this->assertRegExp('/' . preg_quote($tf->questiontext) . '/', + $this->assertRegExp('/' . preg_quote($tf->questiontext, '/') . '/', $this->quba->get_question_summary($this->slot)); $this->assertNull($this->quba->get_response_summary($this->slot)); @@ -97,7 +97,7 @@ class qbehaviour_deferredfeedback_walkthrough_test extends qbehaviour_walkthroug $this->check_current_state(question_state::$mangrpartial); $this->check_current_mark(1); $this->check_current_output( - new question_pattern_expectation('/' . preg_quote('Not good enough!') . '/')); + new question_pattern_expectation('/' . preg_quote('Not good enough!', '/') . '/')); // Now change the correct answer to the question, and regrade. $tf->rightanswer = false; diff --git a/question/behaviour/immediatecbm/tests/walkthrough_test.php b/question/behaviour/immediatecbm/tests/walkthrough_test.php index b0f3d9acb1f..4154dde5758 100644 --- a/question/behaviour/immediatecbm/tests/walkthrough_test.php +++ b/question/behaviour/immediatecbm/tests/walkthrough_test.php @@ -60,7 +60,7 @@ class qbehaviour_immediatecbm_walkthrough_test extends qbehaviour_walkthrough_te $this->get_does_not_contain_feedback_expectation()); $this->assertEquals('A [' . question_cbm::get_string(question_cbm::HIGH) . ']', $this->quba->get_right_answer_summary($this->slot)); - $this->assertRegExp('/' . preg_quote($mc->questiontext) . '/', + $this->assertRegExp('/' . preg_quote($mc->questiontext, '/') . '/', $this->quba->get_question_summary($this->slot)); $this->assertNull($this->quba->get_response_summary($this->slot)); @@ -116,7 +116,7 @@ class qbehaviour_immediatecbm_walkthrough_test extends qbehaviour_walkthrough_te $this->check_current_mark(0.5); $this->check_current_output( $this->get_contains_partcorrect_expectation(), - new question_pattern_expectation('/' . preg_quote('Not good enough!') . '/')); + new question_pattern_expectation('/' . preg_quote('Not good enough!', '/') . '/')); // Now change the correct answer to the question, and regrade. $mc->answers[13]->fraction = -0.33333333; @@ -183,7 +183,7 @@ class qbehaviour_immediatecbm_walkthrough_test extends qbehaviour_walkthrough_te $this->check_current_mark(0.5); $this->check_current_output( $this->get_contains_partcorrect_expectation(), - new question_pattern_expectation('/' . preg_quote('Not good enough!') . '/')); + new question_pattern_expectation('/' . preg_quote('Not good enough!', '/') . '/')); } public function test_immediatecbm_feedback_shortanswer_try_to_submit_no_certainty() { diff --git a/question/behaviour/immediatefeedback/tests/walkthrough_test.php b/question/behaviour/immediatefeedback/tests/walkthrough_test.php index ebea45ebe35..4708dde876e 100644 --- a/question/behaviour/immediatefeedback/tests/walkthrough_test.php +++ b/question/behaviour/immediatefeedback/tests/walkthrough_test.php @@ -123,7 +123,7 @@ class qbehaviour_immediatefeedback_walkthrough_test extends qbehaviour_walkthrou $this->check_current_mark(0.5); $this->check_current_output( $this->get_contains_partcorrect_expectation(), - new question_pattern_expectation('/' . preg_quote('Not good enough!') . '/')); + new question_pattern_expectation('/' . preg_quote('Not good enough!', '/') . '/')); // Now change the correct answer to the question, and regrade. $mc->answers[13]->fraction = -0.33333333; @@ -192,7 +192,7 @@ class qbehaviour_immediatefeedback_walkthrough_test extends qbehaviour_walkthrou $this->check_current_mark(0.5); $this->check_current_output( $this->get_contains_partcorrect_expectation(), - new question_pattern_expectation('/' . preg_quote('Not good enough!') . '/')); + new question_pattern_expectation('/' . preg_quote('Not good enough!', '/') . '/')); } public function test_immediatefeedback_feedback_multichoice_wrong_on_finish() { diff --git a/question/behaviour/informationitem/tests/walkthrough_test.php b/question/behaviour/informationitem/tests/walkthrough_test.php index d2b4744861a..544d3d96eae 100644 --- a/question/behaviour/informationitem/tests/walkthrough_test.php +++ b/question/behaviour/informationitem/tests/walkthrough_test.php @@ -79,7 +79,7 @@ class qbehaviour_informationitem_walkthrough_test extends qbehaviour_walkthrough $this->check_current_state(question_state::$manfinished); $this->check_current_mark(null); $this->check_current_output( - new question_pattern_expectation('/' . preg_quote('Not good enough!') . '/')); + new question_pattern_expectation('/' . preg_quote('Not good enough!', '/') . '/')); // Check that trying to process a manual comment with a grade causes an exception. $this->setExpectedException('moodle_exception'); diff --git a/question/behaviour/interactive/tests/walkthrough_test.php b/question/behaviour/interactive/tests/walkthrough_test.php index 4af3490607b..ee23cf8acbe 100644 --- a/question/behaviour/interactive/tests/walkthrough_test.php +++ b/question/behaviour/interactive/tests/walkthrough_test.php @@ -99,7 +99,7 @@ class qbehaviour_interactive_walkthrough_test extends qbehaviour_walkthrough_tes $this->get_contains_try_again_button_expectation(true), $this->get_does_not_contain_correctness_expectation(), new question_pattern_expectation('/' . - preg_quote(get_string('notcomplete', 'qbehaviour_interactive')) . '/'), + preg_quote(get_string('notcomplete', 'qbehaviour_interactive'), '/') . '/'), $this->get_contains_hint_expectation('This is the first hint')); // Check that, if we review in this state, the try again button is disabled. @@ -165,7 +165,7 @@ class qbehaviour_interactive_walkthrough_test extends qbehaviour_walkthrough_tes $this->check_current_output( $this->get_contains_mark_summary(0.5), $this->get_contains_partcorrect_expectation(), - new question_pattern_expectation('/' . preg_quote('Not good enough!') . '/')); + new question_pattern_expectation('/' . preg_quote('Not good enough!', '/') . '/')); // Check regrading does not mess anything up. $this->quba->regrade_all_questions(); @@ -224,7 +224,7 @@ class qbehaviour_interactive_walkthrough_test extends qbehaviour_walkthrough_tes $this->get_contains_try_again_button_expectation(true), $this->get_does_not_contain_correctness_expectation(), new question_pattern_expectation('/' . - preg_quote(get_string('notcomplete', 'qbehaviour_interactive')) . '/'), + preg_quote(get_string('notcomplete', 'qbehaviour_interactive'), '/') . '/'), $this->get_contains_hint_expectation('This is the first hint')); // Finish the attempt. @@ -289,7 +289,7 @@ class qbehaviour_interactive_walkthrough_test extends qbehaviour_walkthrough_tes $this->get_does_not_contain_validation_error_expectation(), $this->get_contains_try_again_button_expectation(true), new question_pattern_expectation('/' . - preg_quote(get_string('notcomplete', 'qbehaviour_interactive')) . '/'), + preg_quote(get_string('notcomplete', 'qbehaviour_interactive'), '/') . '/'), $this->get_contains_hint_expectation('This is the first hint')); $this->assertEquals('newt', $this->quba->get_response_summary($this->slot)); @@ -387,7 +387,7 @@ class qbehaviour_interactive_walkthrough_test extends qbehaviour_walkthrough_tes $this->get_contains_try_again_button_expectation(true), $this->get_does_not_contain_correctness_expectation(), new question_pattern_expectation('/' . - preg_quote(get_string('notcomplete', 'qbehaviour_interactive')) . '/'), + preg_quote(get_string('notcomplete', 'qbehaviour_interactive'), '/') . '/'), $this->get_contains_hint_expectation('This is the first hint'), $this->get_contains_num_parts_correct(1), $this->get_contains_standard_incorrect_combined_feedback_expectation(), diff --git a/question/behaviour/interactivecountback/tests/walkthrough_test.php b/question/behaviour/interactivecountback/tests/walkthrough_test.php index 844ec222880..aa577b81545 100644 --- a/question/behaviour/interactivecountback/tests/walkthrough_test.php +++ b/question/behaviour/interactivecountback/tests/walkthrough_test.php @@ -91,7 +91,7 @@ class qbehaviour_interactivecountback_walkthrough_test extends qbehaviour_walkth $this->get_contains_try_again_button_expectation(true), $this->get_does_not_contain_correctness_expectation(), new question_pattern_expectation('/' . - preg_quote(get_string('notcomplete', 'qbehaviour_interactive')) . '/'), + preg_quote(get_string('notcomplete', 'qbehaviour_interactive'), '/') . '/'), $this->get_contains_hint_expectation('This is the first hint'), $this->get_contains_num_parts_correct(2), $this->get_contains_standard_partiallycorrect_combined_feedback_expectation(), diff --git a/question/behaviour/manualgraded/tests/walkthrough_test.php b/question/behaviour/manualgraded/tests/walkthrough_test.php index 32af7296692..2b8a4621ae6 100644 --- a/question/behaviour/manualgraded/tests/walkthrough_test.php +++ b/question/behaviour/manualgraded/tests/walkthrough_test.php @@ -96,7 +96,7 @@ class qbehaviour_manualgraded_walkthrough_test extends qbehaviour_walkthrough_te $this->check_current_state(question_state::$mangrright); $this->check_current_mark(10); $this->check_current_output( - new question_pattern_expectation('/' . preg_quote('Not good enough!') . '/')); + new question_pattern_expectation('/' . preg_quote('Not good enough!', '/') . '/')); // Now change the max mark for the question and regrade. $this->quba->regrade_question($this->slot, true, 1); @@ -147,7 +147,7 @@ class qbehaviour_manualgraded_walkthrough_test extends qbehaviour_walkthrough_te $this->check_current_output( $this->get_does_not_contain_correctness_expectation(), $this->get_does_not_contain_specific_feedback_expectation(), - new question_pattern_expectation('/' . preg_quote('Not good enough!') . '/')); + new question_pattern_expectation('/' . preg_quote('Not good enough!', '/') . '/')); } public function test_manual_graded_ignore_repeat_sumbission() { @@ -194,7 +194,7 @@ class qbehaviour_manualgraded_walkthrough_test extends qbehaviour_walkthrough_te $this->check_current_mark(null); $this->check_current_output( new question_pattern_expectation('/' . - preg_quote('I am not sure what grade to award.') . '/')); + preg_quote('I am not sure what grade to award.', '/') . '/')); // Now grade it. $this->manual_grade('Pretty good!', '9.00000'); @@ -202,7 +202,7 @@ class qbehaviour_manualgraded_walkthrough_test extends qbehaviour_walkthrough_te $this->check_current_state(question_state::$mangrpartial); $this->check_current_mark(9); $this->check_current_output( - new question_pattern_expectation('/' . preg_quote('Pretty good!') . '/')); + new question_pattern_expectation('/' . preg_quote('Pretty good!', '/') . '/')); // Process the same data again, and make sure it does not add a step. $this->manual_grade('Pretty good!', '9.00000'); @@ -217,7 +217,7 @@ class qbehaviour_manualgraded_walkthrough_test extends qbehaviour_walkthrough_te $this->check_current_mark(null); $this->check_current_output( new question_pattern_expectation('/' . - preg_quote('Actually, I am not sure any more.') . '/')); + preg_quote('Actually, I am not sure any more.', '/') . '/')); $qa = $this->quba->get_question_attempt($this->slot); $this->assertEquals('Commented: Actually, I am not sure any more.', diff --git a/question/behaviour/missing/tests/missingbehaviour_test.php b/question/behaviour/missing/tests/missingbehaviour_test.php index 6c43c67c368..4922ae7b458 100644 --- a/question/behaviour/missing/tests/missingbehaviour_test.php +++ b/question/behaviour/missing/tests/missingbehaviour_test.php @@ -101,9 +101,9 @@ class qbehaviour_missing_test extends advanced_testcase { $this->assertEquals(array('-submit' => '1', 'choice0' => '1'), $step->get_all_data()); $output = $qa->render(new question_display_options(), '1'); - $this->assertRegExp('/' . preg_quote($qa->get_question()->questiontext) . '/', $output); + $this->assertRegExp('/' . preg_quote($qa->get_question()->questiontext, '/') . '/', $output); $this->assertRegExp('/' . preg_quote( - get_string('questionusedunknownmodel', 'qbehaviour_missing')) . '/', $output); + get_string('questionusedunknownmodel', 'qbehaviour_missing'), '/') . '/', $output); $this->assertTag(array('tag'=>'div', 'attributes'=>array('class'=>'warning')), $output); } } diff --git a/question/engine/questionattempt.php b/question/engine/questionattempt.php index 57041f0b7f3..c4d6061220a 100644 --- a/question/engine/questionattempt.php +++ b/question/engine/questionattempt.php @@ -958,7 +958,7 @@ class question_attempt { $postdata = $_POST; } - $pattern = '/^' . preg_quote($this->get_field_prefix()) . '[^-:]/'; + $pattern = '/^' . preg_quote($this->get_field_prefix(), '/') . '[^-:]/'; $prefixlen = strlen($this->get_field_prefix()); $submitteddata = array(); diff --git a/question/engine/questionattemptstep.php b/question/engine/questionattemptstep.php index 20a34da5c81..5cbd5c8a65c 100644 --- a/question/engine/questionattemptstep.php +++ b/question/engine/questionattemptstep.php @@ -534,7 +534,7 @@ class question_attempt_step_subquestion_adapter extends question_attempt_step { * null if the extre prefix was not present. */ public function remove_prefix($field) { - if (preg_match('~^(-?_?)' . preg_quote($this->extraprefix) . '(.*)$~', $field, $matches)) { + if (preg_match('~^(-?_?)' . preg_quote($this->extraprefix, '~') . '(.*)$~', $field, $matches)) { return $matches[1] . $matches[2]; } else { return null; diff --git a/question/engine/tests/helpers.php b/question/engine/tests/helpers.php index c3f7611f21a..cc8fbfe43e5 100644 --- a/question/engine/tests/helpers.php +++ b/question/engine/tests/helpers.php @@ -697,11 +697,11 @@ abstract class qbehaviour_walkthrough_test_base extends question_testcase { } protected function get_contains_question_text_expectation($question) { - return new question_pattern_expectation('/' . preg_quote($question->questiontext) . '/'); + return new question_pattern_expectation('/' . preg_quote($question->questiontext, '/') . '/'); } protected function get_contains_general_feedback_expectation($question) { - return new question_pattern_expectation('/' . preg_quote($question->generalfeedback) . '/'); + return new question_pattern_expectation('/' . preg_quote($question->generalfeedback, '/') . '/'); } protected function get_does_not_contain_correctness_expectation() { @@ -709,31 +709,31 @@ abstract class qbehaviour_walkthrough_test_base extends question_testcase { } protected function get_contains_correct_expectation() { - return new question_pattern_expectation('/' . preg_quote(get_string('correct', 'question')) . '/'); + return new question_pattern_expectation('/' . preg_quote(get_string('correct', 'question'), '/') . '/'); } protected function get_contains_partcorrect_expectation() { return new question_pattern_expectation('/' . - preg_quote(get_string('partiallycorrect', 'question')) . '/'); + preg_quote(get_string('partiallycorrect', 'question'), '/') . '/'); } protected function get_contains_incorrect_expectation() { - return new question_pattern_expectation('/' . preg_quote(get_string('incorrect', 'question')) . '/'); + return new question_pattern_expectation('/' . preg_quote(get_string('incorrect', 'question'), '/') . '/'); } protected function get_contains_standard_correct_combined_feedback_expectation() { return new question_pattern_expectation('/' . - preg_quote(test_question_maker::STANDARD_OVERALL_CORRECT_FEEDBACK) . '/'); + preg_quote(test_question_maker::STANDARD_OVERALL_CORRECT_FEEDBACK, '/') . '/'); } protected function get_contains_standard_partiallycorrect_combined_feedback_expectation() { return new question_pattern_expectation('/' . - preg_quote(test_question_maker::STANDARD_OVERALL_PARTIALLYCORRECT_FEEDBACK) . '/'); + preg_quote(test_question_maker::STANDARD_OVERALL_PARTIALLYCORRECT_FEEDBACK, '/') . '/'); } protected function get_contains_standard_incorrect_combined_feedback_expectation() { return new question_pattern_expectation('/' . - preg_quote(test_question_maker::STANDARD_OVERALL_INCORRECT_FEEDBACK) . '/'); + preg_quote(test_question_maker::STANDARD_OVERALL_INCORRECT_FEEDBACK, '/') . '/'); } protected function get_does_not_contain_feedback_expectation() { @@ -748,7 +748,7 @@ abstract class qbehaviour_walkthrough_test_base extends question_testcase { $a = new stdClass(); $a->num = $num; return new question_pattern_expectation('/