From dff5793807161346c707ebc54e6969728a0cab41 Mon Sep 17 00:00:00 2001 From: "Eloy Lafuente (stronk7)" Date: Sat, 17 Sep 2022 19:53:13 +0200 Subject: [PATCH] MDL-75757 phpunit: Add some tolerance to a few failing assertions Recently, PHPUnit (all versions) did some changes about how the comparators worked and this has caused some float comparisons to stop working. We need to move them to assertEqualsWithDelta(), allowing a small tolerance to workaround the floats comparison problem. 0.00001 has been decided. And applied to all the similar assertions within the unittest function, so if more cases are added to them better be copied with the agreed tolerance. --- .../deferredcbm/tests/behaviour_type_test.php | 7 ++++--- question/engine/tests/helpers.php | 5 +++++ question/type/multianswer/tests/question_test.php | 11 ++++++----- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/question/behaviour/deferredcbm/tests/behaviour_type_test.php b/question/behaviour/deferredcbm/tests/behaviour_type_test.php index 0d1ab506ad8..6cff5fef789 100644 --- a/question/behaviour/deferredcbm/tests/behaviour_type_test.php +++ b/question/behaviour/deferredcbm/tests/behaviour_type_test.php @@ -18,6 +18,7 @@ namespace qbehaviour_deferredcbm; use question_display_options; use question_engine; +use question_testcase; defined('MOODLE_INTERNAL') || die(); @@ -134,8 +135,8 @@ class behaviour_type_test extends \qbehaviour_walkthrough_test_base { } public function test_calculate_bonus() { - $this->assertEquals(0.05, $this->behaviourtype->calculate_bonus(1, 1/2)); - $this->assertEquals(-0.01, $this->behaviourtype->calculate_bonus(2, 9/10)); - $this->assertEquals(0, $this->behaviourtype->calculate_bonus(3, 1)); + $this->assertEqualsWithDelta(0.05, $this->behaviourtype->calculate_bonus(1, 1 / 2), question_testcase::GRADE_DELTA); + $this->assertEqualsWithDelta(-0.01, $this->behaviourtype->calculate_bonus(2, 9 / 10), question_testcase::GRADE_DELTA); + $this->assertEqualsWithDelta(0, $this->behaviourtype->calculate_bonus(3, 1), question_testcase::GRADE_DELTA); } } diff --git a/question/engine/tests/helpers.php b/question/engine/tests/helpers.php index b3865a4dec8..a1abe623985 100644 --- a/question/engine/tests/helpers.php +++ b/question/engine/tests/helpers.php @@ -480,6 +480,11 @@ abstract class data_loading_method_test_base extends advanced_testcase { abstract class question_testcase extends advanced_testcase { + /** + * Tolerance accepted in some unit tests when float operations are involved. + */ + const GRADE_DELTA = 0.00000005; + public function assert($expectation, $compare, $notused = '') { if (get_class($expectation) === 'question_pattern_expectation') { diff --git a/question/type/multianswer/tests/question_test.php b/question/type/multianswer/tests/question_test.php index ae38468730a..407d8b97487 100644 --- a/question/type/multianswer/tests/question_test.php +++ b/question/type/multianswer/tests/question_test.php @@ -19,6 +19,7 @@ namespace qtype_multianswer; use question_attempt_step; use question_display_options; use question_state; +use question_testcase; defined('MOODLE_INTERNAL') || die(); @@ -199,7 +200,7 @@ class question_test extends \advanced_testcase { 2 => array('sub1_answer' => 'Owl', 'sub2_answer' => $right), ); $finalgrade = $question->compute_final_grade($responses, 1); - $this->assertEquals(1 / 3 * (1 - 0.2) + 2 / 3 * (1 - 2 * 0.2), $finalgrade); + $this->assertEqualsWithDelta(1 / 3 * (1 - 0.2) + 2 / 3 * (1 - 2 * 0.2), $finalgrade, question_testcase::GRADE_DELTA); // Get subquestion 1 right at 3rd try and subquestion 2 right at 2nd try. $responses = array(0 => array('sub1_answer' => 'Dog', 'sub2_answer' => $wrong), @@ -208,7 +209,7 @@ class question_test extends \advanced_testcase { 3 => array('sub1_answer' => 'Owl', 'sub2_answer' => $right), ); $finalgrade = $question->compute_final_grade($responses, 1); - $this->assertEquals(1 / 3 * (1 - 2 * 0.2) + 2 / 3 * (1 - 0.2), $finalgrade); + $this->assertEqualsWithDelta(1 / 3 * (1 - 2 * 0.2) + 2 / 3 * (1 - 0.2), $finalgrade, question_testcase::GRADE_DELTA); // Get subquestion 1 right at 4th try and subquestion 2 right at 1st try. $responses = array(0 => array('sub1_answer' => 'Dog', 'sub2_answer' => $right), @@ -217,7 +218,7 @@ class question_test extends \advanced_testcase { 3 => array('sub1_answer' => 'Owl', 'sub2_answer' => $right), ); $finalgrade = $question->compute_final_grade($responses, 1); - $this->assertEquals(1 / 3 * (1 - 3 * 0.2) + 2 / 3, $finalgrade); + $this->assertEqualsWithDelta(1 / 3 * (1 - 3 * 0.2) + 2 / 3, $finalgrade, question_testcase::GRADE_DELTA); // Get subquestion 1 right at 4th try and subquestion 2 right 3rd try. // Subquestion 2 was right at 1st try, but last change is at 3rd try. @@ -227,7 +228,7 @@ class question_test extends \advanced_testcase { 3 => array('sub1_answer' => 'Owl', 'sub2_answer' => $right), ); $finalgrade = $question->compute_final_grade($responses, 1); - $this->assertEquals(1 / 3 * (1 - 3 * 0.2) + 2 / 3 * (1 - 2 * 0.2), $finalgrade); + $this->assertEqualsWithDelta(1 / 3 * (1 - 3 * 0.2) + 2 / 3 * (1 - 2 * 0.2), $finalgrade, question_testcase::GRADE_DELTA); // Incomplete responses. Subquestion 1 is right at 4th try and subquestion 2 at 3rd try. $responses = array(0 => array('sub1_answer' => 'Dog'), @@ -236,7 +237,7 @@ class question_test extends \advanced_testcase { 3 => array('sub1_answer' => 'Owl', 'sub2_answer' => $right), ); $finalgrade = $question->compute_final_grade($responses, 1); - $this->assertEquals(1 / 3 * (1 - 3 * 0.2) + 2 / 3 * (1 - 2 * 0.2), $finalgrade); + $this->assertEqualsWithDelta(1 / 3 * (1 - 3 * 0.2) + 2 / 3 * (1 - 2 * 0.2), $finalgrade, question_testcase::GRADE_DELTA); } /**