diff --git a/reportbuilder/classes/local/aggregation/avg.php b/reportbuilder/classes/local/aggregation/avg.php index 09e79b9ee25..16ff16a9c4b 100644 --- a/reportbuilder/classes/local/aggregation/avg.php +++ b/reportbuilder/classes/local/aggregation/avg.php @@ -49,6 +49,7 @@ class avg extends base { return in_array($columntype, [ column::TYPE_INTEGER, column::TYPE_FLOAT, + column::TYPE_BOOLEAN, ]); } @@ -72,6 +73,6 @@ class avg extends base { * @return mixed */ public static function format_value($value, array $values, array $callbacks) { - return sprintf('%.1f', (float) reset($values)); + return format_float((float) reset($values), 1); } } diff --git a/reportbuilder/classes/local/aggregation/percent.php b/reportbuilder/classes/local/aggregation/percent.php index 62fae8afa59..29b9878196c 100644 --- a/reportbuilder/classes/local/aggregation/percent.php +++ b/reportbuilder/classes/local/aggregation/percent.php @@ -72,6 +72,6 @@ class percent extends base { * @return mixed */ public static function format_value($value, array $values, array $callbacks) { - return format::percent((float) reset($values)); + return format::percent(reset($values)); } } diff --git a/reportbuilder/classes/local/helpers/format.php b/reportbuilder/classes/local/helpers/format.php index 8a0a2971764..0ac617e6e40 100644 --- a/reportbuilder/classes/local/helpers/format.php +++ b/reportbuilder/classes/local/helpers/format.php @@ -61,6 +61,6 @@ class format { * @return string */ public static function percent($value): string { - return sprintf('%.1f%%', (float) $value); + return format_float((float) $value, 1) . '%'; } } diff --git a/reportbuilder/tests/behat/columnaggregationeditor.feature b/reportbuilder/tests/behat/columnaggregationeditor.feature index 0ceccb9714c..2eaaca32c06 100644 --- a/reportbuilder/tests/behat/columnaggregationeditor.feature +++ b/reportbuilder/tests/behat/columnaggregationeditor.feature @@ -92,9 +92,31 @@ Feature: Manage custom report columns aggregation | Count distinct | 2 | | Maximum | Yes | | Minimum | No | + | Average | 0.7 | | Percentage | 66.7% | | Sum | 2 | + Scenario Outline: Aggregated columns display localised floats + Given the following "language customisations" exist: + | component | stringid | value | + | core_langconfig | decsep | , | + And the following "core_reportbuilder > Reports" exist: + | name | source | default | + | My report | core_user\reportbuilder\datasource\users | 0 | + And the following "core_reportbuilder > Columns" exist: + | report | uniqueidentifier | + | My report | user:lastname | + | My report | user:confirmed | + And I am on the "My report" "reportbuilder > Editor" page logged in as "admin" + And I change window size to "large" + When I set the "Confirmed" column aggregation to "" + Then I should see "Aggregated column 'Confirmed'" + And I should see "" in the "Richie" "table_row" + Examples: + | aggregation | output | + | Average | 0,7 | + | Percentage | 66,7% | + Scenario: Show unique report rows Given the following "core_reportbuilder > Reports" exist: | name | source | default | uniquerows | diff --git a/reportbuilder/tests/local/aggregation/avg_test.php b/reportbuilder/tests/local/aggregation/avg_test.php new file mode 100644 index 00000000000..6162b04764a --- /dev/null +++ b/reportbuilder/tests/local/aggregation/avg_test.php @@ -0,0 +1,76 @@ +. + +declare(strict_types=1); + +namespace core_reportbuilder\local\aggregation; + +use core_reportbuilder_testcase; +use core_reportbuilder_generator; +use core_user\reportbuilder\datasource\users; + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; +require_once("{$CFG->dirroot}/reportbuilder/tests/helpers.php"); + +/** + * Unit tests for avg aggregation + * + * @package core_reportbuilder + * @covers \core_reportbuilder\local\aggregation\avg + * @copyright 2022 Paul Holden + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class avg_test extends core_reportbuilder_testcase { + + /** + * Test aggregation when applied to column + */ + public function test_column_aggregation(): void { + $this->resetAfterTest(); + + // Test subjects. + $this->getDataGenerator()->create_user(['firstname' => 'Bob', 'suspended' => 1]); + $this->getDataGenerator()->create_user(['firstname' => 'Bob', 'suspended' => 0]); + + /** @var core_reportbuilder_generator $generator */ + $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); + $report = $generator->create_report(['name' => 'Users', 'source' => users::class, 'default' => 0]); + + // First column, sorted. + $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:firstname']) + ->set('sortenabled', true) + ->update(); + + // This is the column we'll aggregate. + $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:suspended']) + ->set('aggregation', avg::get_class_name()) + ->update(); + + $content = $this->get_custom_report_content($report->get('id')); + $this->assertEquals([ + [ + 'c0_firstname' => 'Admin', + 'c1_suspended' => '0.0', + ], + [ + 'c0_firstname' => 'Bob', + 'c1_suspended' => '0.5', + ], + ], $content); + } +} diff --git a/reportbuilder/tests/local/aggregation/sum_test.php b/reportbuilder/tests/local/aggregation/sum_test.php index 8d5fb393c23..d458636a600 100644 --- a/reportbuilder/tests/local/aggregation/sum_test.php +++ b/reportbuilder/tests/local/aggregation/sum_test.php @@ -28,7 +28,7 @@ global $CFG; require_once("{$CFG->dirroot}/reportbuilder/tests/helpers.php"); /** - * Unit tests for percent aggregation + * Unit tests for sum aggregation * * @package core_reportbuilder * @covers \core_reportbuilder\local\aggregation\base diff --git a/reportbuilder/tests/local/helpers/format_test.php b/reportbuilder/tests/local/helpers/format_test.php index ef365d08ffb..e354b2f5531 100644 --- a/reportbuilder/tests/local/helpers/format_test.php +++ b/reportbuilder/tests/local/helpers/format_test.php @@ -64,4 +64,11 @@ class format_test extends advanced_testcase { public function test_boolean_as_text(bool $value, string $expected): void { $this->assertEquals($expected, format::boolean_as_text($value)); } + + /** + * Test percentage formatting of a float + */ + public function test_percent(): void { + $this->assertEquals('33.3%', format::percent(1 / 3 * 100)); + } }