From 897a492729725c00ede17d85384c258da53d417d Mon Sep 17 00:00:00 2001 From: Marina Glancy Date: Wed, 16 May 2018 15:25:11 +0800 Subject: [PATCH] MDL-62469 qtype_calculated: check remaining placeholders, see MDL-62275 --- question/type/calculated/question.php | 8 +++++++- question/type/calculated/tests/variablesubstituter_test.php | 7 +++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/question/type/calculated/question.php b/question/type/calculated/question.php index 6fb1cf12166..2936c05ba68 100644 --- a/question/type/calculated/question.php +++ b/question/type/calculated/question.php @@ -424,7 +424,13 @@ class qtype_calculated_variable_substituter { if ($error = qtype_calculated_find_formula_errors($expression)) { throw new moodle_exception('illegalformulasyntax', 'qtype_calculated', '', $error); } - return $this->calculate_raw($this->substitute_values_for_eval($expression)); + $expression = $this->substitute_values_for_eval($expression); + if ($datasets = question_bank::get_qtype('calculated')->find_dataset_names($expression)) { + // Some placeholders were not substituted. + throw new moodle_exception('illegalformulasyntax', 'qtype_calculated', '', + '{' . reset($datasets) . '}'); + } + return $this->calculate_raw($expression); } /** diff --git a/question/type/calculated/tests/variablesubstituter_test.php b/question/type/calculated/tests/variablesubstituter_test.php index 0a66ad866f4..a42d4268080 100644 --- a/question/type/calculated/tests/variablesubstituter_test.php +++ b/question/type/calculated/tests/variablesubstituter_test.php @@ -99,6 +99,13 @@ class qtype_calculated_variable_substituter_test extends advanced_testcase { $this->assertEquals('= 3', $vs->replace_expressions_in_text('= {={a} + {b}}')); } + public function test_expression_has_unmapped_placeholder() { + $this->expectException('moodle_exception'); + $this->expectExceptionMessage(get_string('illegalformulasyntax', 'qtype_calculated', '{c}')); + $vs = new qtype_calculated_variable_substituter(array('a' => 1, 'b' => 2), '.'); + $vs->calculate('{c} - {a} + {b}'); + } + public function test_replace_expressions_in_text_negative() { $vs = new qtype_calculated_variable_substituter(array('a' => -1, 'b' => 2), '.'); $this->assertEquals('temperatures -1 and 2', -- 2.11.4.GIT