MDL-59212 analytics: Expand unit test coverage
authorDavid Monllao <davidm@moodle.com>
Wed, 21 Jun 2017 19:01:14 +0000 (21:01 +0200)
committerDavid Monllao <davidm@moodle.com>
Mon, 24 Jul 2017 06:36:59 +0000 (08:36 +0200)
Part of MDL-57791 epic.

analytics/tests/time_splittings_test.php [new file with mode: 0644]

diff --git a/analytics/tests/time_splittings_test.php b/analytics/tests/time_splittings_test.php
new file mode 100644 (file)
index 0000000..d1c5297
--- /dev/null
@@ -0,0 +1,181 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Unit tests for core time splitting methods.
+ *
+ * @package   core_analytics
+ * @copyright 2017 David MonllaĆ³ {@link http://www.davidmonllao.com}
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+require_once(__DIR__ . '/fixtures/test_target_shortname.php');
+require_once(__DIR__ . '/../../lib/enrollib.php');
+
+/**
+ * Unit tests for core time splitting methods.
+ *
+ * @package   core_analytics
+ * @copyright 2017 David MonllaĆ³ {@link http://www.davidmonllao.com}
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class analytics_time_splittings_testcase extends advanced_testcase {
+
+    /**
+     * setUp
+     *
+     * @return void
+     */
+    public function setUp() {
+
+        $this->resetAfterTest(true);
+
+        // Generate training data.
+        $params = array(
+            'startdate' => mktime(8, 15, 32, 10, 24, 2015),
+            'enddate' => mktime(12, 12, 31, 10, 24, 2016),
+        );
+        $course = $this->getDataGenerator()->create_course($params);
+        $this->analysable = new \core_analytics\course($course);
+    }
+
+    /**
+     * test_ranges
+     *
+     * @return void
+     */
+    public function test_valid_ranges() {
+
+        // All core_analytics time splitting methods.
+        $timesplittings = array(
+            '\\core_analytics\\local\\time_splitting\\deciles',
+            '\\core_analytics\\local\\time_splitting\\deciles_accum',
+            '\\core_analytics\\local\\time_splitting\\no_splitting',
+            '\\core_analytics\\local\\time_splitting\\quarters',
+            '\\core_analytics\\local\\time_splitting\\quarters_accum',
+            '\\core_analytics\\local\\time_splitting\\single_range'
+        );
+
+        // Check that defined ranges are valid (tested through validate_ranges).
+        foreach ($timesplittings as $timesplitting) {
+            $instance = new $timesplitting();
+            $instance->set_analysable($this->analysable);
+        }
+    }
+
+    /**
+     * test_range_dates
+     *
+     * @return void
+     */
+    public function test_range_dates() {
+
+        $nov2015 = mktime(0, 0, 0, 11, 24, 2015);
+        $aug2016 = mktime(0, 0, 0, 8, 29, 2016);
+
+        // Equal parts.
+        $quarters = new \core_analytics\local\time_splitting\quarters();
+        $quarters->set_analysable($this->analysable);
+        $ranges = $quarters->get_all_ranges();
+        $this->assertCount(4, $ranges);
+
+        $this->assertGreaterThan($ranges[0]['start'], $ranges[1]['start']);
+        $this->assertGreaterThan($ranges[0]['end'], $ranges[1]['start']);
+        $this->assertGreaterThan($ranges[0]['end'], $ranges[1]['end']);
+
+        $this->assertGreaterThan($ranges[1]['start'], $ranges[2]['start']);
+        $this->assertGreaterThan($ranges[1]['end'], $ranges[2]['start']);
+        $this->assertGreaterThan($ranges[1]['end'], $ranges[2]['end']);
+
+        $this->assertGreaterThan($ranges[2]['start'], $ranges[3]['start']);
+        $this->assertGreaterThan($ranges[2]['end'], $ranges[3]['end']);
+        $this->assertGreaterThan($ranges[2]['end'], $ranges[3]['start']);
+
+        // First range.
+        $this->assertLessThan($nov2015, $ranges[0]['start']);
+        $this->assertGreaterThan($nov2015, $ranges[0]['end']);
+
+        // Last range.
+        $this->assertLessThan($aug2016, $ranges[3]['start']);
+        $this->assertGreaterThan($aug2016, $ranges[3]['end']);
+
+        // Accumulative.
+        $accum = new \core_analytics\local\time_splitting\quarters_accum();
+        $accum->set_analysable($this->analysable);
+        $ranges = $accum->get_all_ranges();
+        $this->assertCount(4, $ranges);
+
+        $this->assertEquals($ranges[0]['start'], $ranges[1]['start']);
+        $this->assertEquals($ranges[1]['start'], $ranges[2]['start']);
+        $this->assertEquals($ranges[2]['start'], $ranges[3]['start']);
+
+        $this->assertGreaterThan($ranges[0]['end'], $ranges[1]['end']);
+        $this->assertGreaterThan($ranges[1]['end'], $ranges[2]['end']);
+        $this->assertGreaterThan($ranges[2]['end'], $ranges[3]['end']);
+
+        // Present in all ranges.
+        $this->assertLessThan($nov2015, $ranges[0]['start']);
+        $this->assertGreaterThan($nov2015, $ranges[0]['end']);
+        $this->assertGreaterThan($nov2015, $ranges[1]['end']);
+        $this->assertGreaterThan($nov2015, $ranges[2]['end']);
+        $this->assertGreaterThan($nov2015, $ranges[3]['end']);
+
+        // Only in the last range.
+        $this->assertLessThan($aug2016, $ranges[0]['end']);
+        $this->assertLessThan($aug2016, $ranges[1]['end']);
+        $this->assertLessThan($aug2016, $ranges[2]['end']);
+        $this->assertLessThan($aug2016, $ranges[3]['start']);
+        $this->assertGreaterThan($aug2016, $ranges[3]['end']);
+    }
+
+    /**
+     * test_ready_predict
+     *
+     * @return void
+     */
+    public function test_ready_predict() {
+
+        $quarters = new \core_analytics\local\time_splitting\quarters();
+        $nosplitting = new \core_analytics\local\time_splitting\no_splitting();
+        $singlerange = new \core_analytics\local\time_splitting\single_range();
+
+        $range = array(
+            'start' => time() - 100,
+            'end' => time() - 20,
+        );
+        $range['time'] = $range['end'];
+        $this->assertTrue($quarters->ready_to_predict($range));
+        $this->assertTrue($nosplitting->ready_to_predict($range));
+
+        // Single range time is 0.
+        $range['time'] = 0;
+        $this->assertTrue($singlerange->ready_to_predict($range));
+
+        $range = array(
+            'start' => time() + 20,
+            'end' => time() + 100,
+        );
+        $range['time'] = $range['end'];
+        $this->assertFalse($quarters->ready_to_predict($range));
+        $this->assertTrue($nosplitting->ready_to_predict($range));
+
+        // Single range time is 0.
+        $range['time'] = 0;
+        $this->assertTrue($singlerange->ready_to_predict($range));
+    }
+}