Merge branch 'MDL-34684_master' of git://github.com/dmonllao/moodle
[moodle.git] / admin / tool / health / tests / healthlib_test.php
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/>.
17 /**
18  * Unit tests for tool_health.
19  *
20  * @package    tool_health
21  * @copyright  2013 Marko Vidberg
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 defined('MOODLE_INTERNAL') || die();
27 global $CFG;
28 require_once($CFG->dirroot . '/' . $CFG->admin . '/tool/health/locallib.php');
30 /**
31  * Health lib testcase.
32  *
33  * @package    tool_health
34  * @copyright  2013 Marko Vidberg
35  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
36  */
37 class healthlib_testcase extends advanced_testcase {
39     /**
40      * Data provider for test_tool_health_category_find_loops.
41      */
42     public static function provider_loop_categories() {
43         return array(
44            // One item loop including root.
45            0 => array(
46                         array(
47                             '1' => (object) array('id' => 1, 'parent' => 1)
48                         ),
49                         array(
50                             '1' => (object) array('id' => 1, 'parent' => 1)
51                         ),
52                 ),
53            // One item loop not including root.
54            1 => array(
55                         array(
56                             '1' => (object) array('id' => 1, 'parent' => 0),
57                             '2' => (object) array('id' => 2, 'parent' => 2)
58                         ),
59                         array(
60                             '2' => (object) array('id' => 2, 'parent' => 2)
61                         ),
62                 ),
63            // Two item loop including root.
64            2 => array(
65                         array(
66                             '1' => (object) array('id' => 1, 'parent' => 2),
67                             '2' => (object) array('id' => 2, 'parent' => 1)
68                         ),
69                         array(
70                             '2' => (object) array('id' => 2, 'parent' => 1),
71                             '1' => (object) array('id' => 1, 'parent' => 2),
72                         )
73                 ),
74            // Two item loop not including root.
75            3 => array(
76                         array(
77                             '1' => (object) array('id' => 1, 'parent' => 0),
78                             '2' => (object) array('id' => 2, 'parent' => 3),
79                             '3' => (object) array('id' => 3, 'parent' => 2),
80                         ),
81                         array(
82                             '3' => (object) array('id' => 3, 'parent' => 2),
83                             '2' => (object) array('id' => 2, 'parent' => 3),
84                         )
85                 ),
86            // Three item loop including root.
87            4 => array(
88                         array(
89                             '1' => (object) array('id' => 1, 'parent' => 2),
90                             '2' => (object) array('id' => 2, 'parent' => 3),
91                             '3' => (object) array('id' => 3, 'parent' => 1),
92                         ),
93                         array(
94                             '3' => (object) array('id' => 3, 'parent' => 1),
95                             '1' => (object) array('id' => 1, 'parent' => 2),
96                             '2' => (object) array('id' => 2, 'parent' => 3),
97                         )
98                 ),
99            // Three item loop not including root.
100            5 => array(
101                         array(
102                             '1' => (object) array('id' => 1, 'parent' => 0),
103                             '2' => (object) array('id' => 2, 'parent' => 3),
104                             '3' => (object) array('id' => 3, 'parent' => 4),
105                             '4' => (object) array('id' => 4, 'parent' => 2)
106                         ),
107                         array(
108                             '4' => (object) array('id' => 4, 'parent' => 2),
109                             '2' => (object) array('id' => 2, 'parent' => 3),
110                             '3' => (object) array('id' => 3, 'parent' => 4),
111                         )
112                 ),
113            // Multi-loop.
114            6 => array(
115                         array(
116                             '1' => (object) array('id' => 1, 'parent' => 2),
117                             '2' => (object) array('id' => 2, 'parent' => 1),
118                             '3' => (object) array('id' => 3, 'parent' => 4),
119                             '4' => (object) array('id' => 4, 'parent' => 5),
120                             '5' => (object) array('id' => 5, 'parent' => 3),
121                             '6' => (object) array('id' => 6, 'parent' => 6),
122                             '7' => (object) array('id' => 7, 'parent' => 1),
123                             '8' => (object) array('id' => 8, 'parent' => 7),
124                         ),
125                         array(
126                             '1' => (object) array('id' => 1, 'parent' => 2),
127                             '2' => (object) array('id' => 2, 'parent' => 1),
128                             '8' => (object) array('id' => 8, 'parent' => 7),
129                             '7' => (object) array('id' => 7, 'parent' => 1),
130                             '6' => (object) array('id' => 6, 'parent' => 6),
131                             '5' => (object) array('id' => 5, 'parent' => 3),
132                             '3' => (object) array('id' => 3, 'parent' => 4),
133                             '4' => (object) array('id' => 4, 'parent' => 5),
134                         )
135                 ),
136            // Double-loop
137            7 => array(
138                         array(
139                             '1' => (object) array('id' => 1, 'parent' => 2),
140                             '2' => (object) array('id' => 2, 'parent' => 1),
141                             '3' => (object) array('id' => 3, 'parent' => 2),
142                             '4' => (object) array('id' => 4, 'parent' => 2),
143                         ),
144                         array(
145                             '4' => (object) array('id' => 4, 'parent' => 2),
146                             '3' => (object) array('id' => 3, 'parent' => 2),
147                             '2' => (object) array('id' => 2, 'parent' => 1),
148                             '1' => (object) array('id' => 1, 'parent' => 2),
149                         )
150                 )
151         );
152     }
154     /**
155      * Data provider for test_tool_health_category_find_missing_parents.
156      */
157     public static function provider_missing_parent_categories() {
158         return array(
159            // Test for two items, both with direct ancestor (parent) missing.
160            0 => array(
161                         array(
162                             '1' => (object) array('id' => 1, 'parent' => 0),
163                             '2' => (object) array('id' => 2, 'parent' => 3),
164                             '4' => (object) array('id' => 4, 'parent' => 5),
165                             '6' => (object) array('id' => 6, 'parent' => 2)
166                         ),
167                         array(
168                             '4' => (object) array('id' => 4, 'parent' => 5),
169                             '2' => (object) array('id' => 2, 'parent' => 3)
170                         ),
171                 )
172         );
173     }
175     /**
176      * Test finding loops between two items referring to each other.
177      *
178      * @param array $categories
179      * @param array $expected
180      * @dataProvider provider_loop_categories
181      */
182     public function test_tool_health_category_find_loops($categories, $expected) {
183         $loops = tool_health_category_find_loops($categories);
184         $this->assertEquals($expected, $loops);
185     }
187     /**
188      * Test finding missing parent categories.
189      *
190      * @param array $categories
191      * @param array $expected
192      * @dataProvider provider_missing_parent_categories
193      */
194     public function test_tool_health_category_find_missing_parents($categories, $expected) {
195         $missingparent = tool_health_category_find_missing_parents($categories);
196         $this->assertEquals($expected, $missingparent);
197     }
199     /**
200      * Test listing missing parent categories.
201      */
202     public function test_tool_health_category_list_missing_parents() {
203         $missingparent = array((object) array('id' => 2, 'parent' => 3, 'name' => 'test'),
204                                (object) array('id' => 4, 'parent' => 5, 'name' => 'test2'));
205         $result = tool_health_category_list_missing_parents($missingparent);
206         $this->assertRegExp('/Category 2: test/', $result);
207         $this->assertRegExp('/Category 4: test2/', $result);
208     }
210     /**
211      * Test listing loop categories.
212      */
213     public function test_tool_health_category_list_loops() {
214         $loops = array((object) array('id' => 2, 'parent' => 3, 'name' => 'test'));
215         $result = tool_health_category_list_loops($loops);
216         $this->assertRegExp('/Category 2: test/', $result);
217     }