/lib/tests/time_splittings_test.php

https://gitlab.com/unofficial-mirrors/moodle · PHP · 183 lines · 93 code · 29 blank · 61 comment · 1 complexity · 52e25122c79690c850ffb0fcce0d633f MD5 · raw file

  1. <?php
  2. // This file is part of Moodle - http://moodle.org/
  3. //
  4. // Moodle is free software: you can redistribute it and/or modify
  5. // it under the terms of the GNU General Public License as published by
  6. // the Free Software Foundation, either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // Moodle is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU General Public License
  15. // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
  16. /**
  17. * Unit tests for core time splitting methods.
  18. *
  19. * @package core
  20. * @category analytics
  21. * @copyright 2017 David Monllaó {@link http://www.davidmonllao.com}
  22. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23. */
  24. defined('MOODLE_INTERNAL') || die();
  25. require_once(__DIR__ . '/../../analytics/tests/fixtures/test_target_shortname.php');
  26. require_once(__DIR__ . '/../../lib/enrollib.php');
  27. /**
  28. * Unit tests for core time splitting methods.
  29. *
  30. * @package core
  31. * @category analytics
  32. * @copyright 2017 David Monllaó {@link http://www.davidmonllao.com}
  33. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  34. */
  35. class core_analytics_time_splittings_testcase extends advanced_testcase {
  36. /**
  37. * setUp
  38. *
  39. * @return void
  40. */
  41. public function setUp() {
  42. $this->resetAfterTest(true);
  43. // Generate training data.
  44. $params = array(
  45. 'startdate' => mktime(8, 15, 32, 10, 24, 2015),
  46. 'enddate' => mktime(12, 12, 31, 10, 24, 2016),
  47. );
  48. $course = $this->getDataGenerator()->create_course($params);
  49. $this->analysable = new \core_analytics\course($course);
  50. }
  51. /**
  52. * test_ranges
  53. *
  54. * @return void
  55. */
  56. public function test_valid_ranges() {
  57. // All core time splitting methods.
  58. $timesplittings = array(
  59. '\core\analytics\time_splitting\deciles',
  60. '\core\analytics\time_splitting\deciles_accum',
  61. '\core\analytics\time_splitting\no_splitting',
  62. '\core\analytics\time_splitting\quarters',
  63. '\core\analytics\time_splitting\quarters_accum',
  64. '\core\analytics\time_splitting\single_range'
  65. );
  66. // Check that defined ranges are valid (tested through validate_ranges).
  67. foreach ($timesplittings as $timesplitting) {
  68. $instance = new $timesplitting();
  69. $instance->set_analysable($this->analysable);
  70. }
  71. }
  72. /**
  73. * test_range_dates
  74. *
  75. * @return void
  76. */
  77. public function test_range_dates() {
  78. $nov2015 = mktime(0, 0, 0, 11, 24, 2015);
  79. $aug2016 = mktime(0, 0, 0, 8, 29, 2016);
  80. // Equal parts.
  81. $quarters = new \core\analytics\time_splitting\quarters();
  82. $quarters->set_analysable($this->analysable);
  83. $ranges = $quarters->get_all_ranges();
  84. $this->assertCount(4, $ranges);
  85. $this->assertGreaterThan($ranges[0]['start'], $ranges[1]['start']);
  86. $this->assertGreaterThan($ranges[0]['end'], $ranges[1]['start']);
  87. $this->assertGreaterThan($ranges[0]['end'], $ranges[1]['end']);
  88. $this->assertGreaterThan($ranges[1]['start'], $ranges[2]['start']);
  89. $this->assertGreaterThan($ranges[1]['end'], $ranges[2]['start']);
  90. $this->assertGreaterThan($ranges[1]['end'], $ranges[2]['end']);
  91. $this->assertGreaterThan($ranges[2]['start'], $ranges[3]['start']);
  92. $this->assertGreaterThan($ranges[2]['end'], $ranges[3]['end']);
  93. $this->assertGreaterThan($ranges[2]['end'], $ranges[3]['start']);
  94. // First range.
  95. $this->assertLessThan($nov2015, $ranges[0]['start']);
  96. $this->assertGreaterThan($nov2015, $ranges[0]['end']);
  97. // Last range.
  98. $this->assertLessThan($aug2016, $ranges[3]['start']);
  99. $this->assertGreaterThan($aug2016, $ranges[3]['end']);
  100. // Accumulative.
  101. $accum = new \core\analytics\time_splitting\quarters_accum();
  102. $accum->set_analysable($this->analysable);
  103. $ranges = $accum->get_all_ranges();
  104. $this->assertCount(4, $ranges);
  105. $this->assertEquals($ranges[0]['start'], $ranges[1]['start']);
  106. $this->assertEquals($ranges[1]['start'], $ranges[2]['start']);
  107. $this->assertEquals($ranges[2]['start'], $ranges[3]['start']);
  108. $this->assertGreaterThan($ranges[0]['end'], $ranges[1]['end']);
  109. $this->assertGreaterThan($ranges[1]['end'], $ranges[2]['end']);
  110. $this->assertGreaterThan($ranges[2]['end'], $ranges[3]['end']);
  111. // Present in all ranges.
  112. $this->assertLessThan($nov2015, $ranges[0]['start']);
  113. $this->assertGreaterThan($nov2015, $ranges[0]['end']);
  114. $this->assertGreaterThan($nov2015, $ranges[1]['end']);
  115. $this->assertGreaterThan($nov2015, $ranges[2]['end']);
  116. $this->assertGreaterThan($nov2015, $ranges[3]['end']);
  117. // Only in the last range.
  118. $this->assertLessThan($aug2016, $ranges[0]['end']);
  119. $this->assertLessThan($aug2016, $ranges[1]['end']);
  120. $this->assertLessThan($aug2016, $ranges[2]['end']);
  121. $this->assertLessThan($aug2016, $ranges[3]['start']);
  122. $this->assertGreaterThan($aug2016, $ranges[3]['end']);
  123. }
  124. /**
  125. * test_ready_predict
  126. *
  127. * @return void
  128. */
  129. public function test_ready_predict() {
  130. $quarters = new \core\analytics\time_splitting\quarters();
  131. $nosplitting = new \core\analytics\time_splitting\no_splitting();
  132. $singlerange = new \core\analytics\time_splitting\single_range();
  133. $range = array(
  134. 'start' => time() - 100,
  135. 'end' => time() - 20,
  136. );
  137. $range['time'] = $range['end'];
  138. $this->assertTrue($quarters->ready_to_predict($range));
  139. $this->assertTrue($nosplitting->ready_to_predict($range));
  140. // Single range time is 0.
  141. $range['time'] = 0;
  142. $this->assertTrue($singlerange->ready_to_predict($range));
  143. $range = array(
  144. 'start' => time() + 20,
  145. 'end' => time() + 100,
  146. );
  147. $range['time'] = $range['end'];
  148. $this->assertFalse($quarters->ready_to_predict($range));
  149. $this->assertTrue($nosplitting->ready_to_predict($range));
  150. // Single range time is 0.
  151. $range['time'] = 0;
  152. $this->assertTrue($singlerange->ready_to_predict($range));
  153. }
  154. }