|
1
|
|
|
<?php |
|
2
|
|
|
|
|
3
|
|
|
/** |
|
4
|
|
|
* @package framework |
|
5
|
|
|
* @subpackage tests |
|
6
|
|
|
*/ |
|
7
|
|
|
class ClassInfoTest extends SapphireTest { |
|
8
|
|
|
|
|
9
|
|
|
protected $extraDataObjects = array( |
|
10
|
|
|
'ClassInfoTest_BaseClass', |
|
11
|
|
|
'ClassInfoTest_BaseDataClass', |
|
12
|
|
|
'ClassInfoTest_ChildClass', |
|
13
|
|
|
'ClassInfoTest_GrandChildClass', |
|
14
|
|
|
'ClassInfoTest_HasFields', |
|
15
|
|
|
'ClassInfoTest_NoFields', |
|
16
|
|
|
'ClassInfoTest_WithCustomTable', |
|
17
|
|
|
'ClassInfoTest_WithRelation', |
|
18
|
|
|
); |
|
19
|
|
|
|
|
20
|
|
|
public function setUp() { |
|
21
|
|
|
parent::setUp(); |
|
22
|
|
|
ClassInfo::reset_db_cache(); |
|
23
|
|
|
} |
|
24
|
|
|
|
|
25
|
|
|
public function testExists() { |
|
26
|
|
|
$this->assertTrue(ClassInfo::exists('Object')); |
|
27
|
|
|
$this->assertTrue(ClassInfo::exists('object')); |
|
28
|
|
|
$this->assertTrue(ClassInfo::exists('ClassInfoTest')); |
|
29
|
|
|
$this->assertTrue(ClassInfo::exists('CLASSINFOTEST')); |
|
30
|
|
|
$this->assertTrue(ClassInfo::exists('stdClass')); |
|
31
|
|
|
$this->assertTrue(ClassInfo::exists('stdCLASS')); |
|
32
|
|
|
$this->assertFalse(ClassInfo::exists('SomeNonExistantClass')); |
|
33
|
|
|
} |
|
34
|
|
|
|
|
35
|
|
|
public function testSubclassesFor() { |
|
36
|
|
|
$this->assertEquals( |
|
37
|
|
|
ClassInfo::subclassesFor('ClassInfoTest_BaseClass'), |
|
38
|
|
|
array( |
|
39
|
|
|
'ClassInfoTest_BaseClass' => 'ClassInfoTest_BaseClass', |
|
40
|
|
|
'ClassInfoTest_ChildClass' => 'ClassInfoTest_ChildClass', |
|
41
|
|
|
'ClassInfoTest_GrandChildClass' => 'ClassInfoTest_GrandChildClass' |
|
42
|
|
|
), |
|
43
|
|
|
'ClassInfo::subclassesFor() returns only direct subclasses and doesnt include base class' |
|
44
|
|
|
); |
|
45
|
|
|
ClassInfo::reset_db_cache(); |
|
46
|
|
|
$this->assertEquals( |
|
47
|
|
|
ClassInfo::subclassesFor('classinfotest_baseclass'), |
|
48
|
|
|
array( |
|
49
|
|
|
'ClassInfoTest_BaseClass' => 'ClassInfoTest_BaseClass', |
|
50
|
|
|
'ClassInfoTest_ChildClass' => 'ClassInfoTest_ChildClass', |
|
51
|
|
|
'ClassInfoTest_GrandChildClass' => 'ClassInfoTest_GrandChildClass' |
|
52
|
|
|
), |
|
53
|
|
|
'ClassInfo::subclassesFor() is acting in a case sensitive way when it should not' |
|
54
|
|
|
); |
|
55
|
|
|
} |
|
56
|
|
|
|
|
57
|
|
|
public function testClassName() |
|
58
|
|
|
{ |
|
59
|
|
|
$this->assertEquals('ClassInfoTest', ClassInfo::class_name($this)); |
|
60
|
|
|
$this->assertEquals('ClassInfoTest', ClassInfo::class_name('ClassInfoTest')); |
|
61
|
|
|
$this->assertEquals('ClassInfoTest', ClassInfo::class_name('CLaSsInfOTEsT')); |
|
62
|
|
|
} |
|
63
|
|
|
|
|
64
|
|
|
public function testNonClassName() { |
|
65
|
|
|
$this->setExpectedException('ReflectionException', 'Class IAmAClassThatDoesNotExist does not exist'); |
|
66
|
|
|
$this->assertEquals('IAmAClassThatDoesNotExist', ClassInfo::class_name('IAmAClassThatDoesNotExist')); |
|
67
|
|
|
} |
|
68
|
|
|
|
|
69
|
|
|
public function testClassesForFolder() { |
|
70
|
|
|
//$baseFolder = Director::baseFolder() . '/' . FRAMEWORK_DIR . '/tests/_ClassInfoTest'; |
|
71
|
|
|
//$manifestInfo = ManifestBuilder::get_manifest_info($baseFolder); |
|
|
|
|
|
|
72
|
|
|
|
|
73
|
|
|
$classes = ClassInfo::classes_for_folder(FRAMEWORK_DIR . '/tests'); |
|
74
|
|
|
$this->assertContains( |
|
75
|
|
|
'classinfotest', |
|
76
|
|
|
$classes, |
|
77
|
|
|
'ClassInfo::classes_for_folder() returns classes matching the filename' |
|
78
|
|
|
); |
|
79
|
|
|
$this->assertContains( |
|
80
|
|
|
'classinfotest_baseclass', |
|
81
|
|
|
$classes, |
|
82
|
|
|
'ClassInfo::classes_for_folder() returns additional classes not matching the filename' |
|
83
|
|
|
); |
|
84
|
|
|
} |
|
85
|
|
|
|
|
86
|
|
|
/** |
|
87
|
|
|
* @covers ClassInfo::ancestry() |
|
88
|
|
|
*/ |
|
89
|
|
|
public function testAncestry() { |
|
90
|
|
|
$ancestry = ClassInfo::ancestry('ClassInfoTest_ChildClass'); |
|
91
|
|
|
$expect = ArrayLib::valuekey(array( |
|
92
|
|
|
'Object', |
|
93
|
|
|
'ViewableData', |
|
94
|
|
|
'DataObject', |
|
95
|
|
|
'ClassInfoTest_BaseClass', |
|
96
|
|
|
'ClassInfoTest_ChildClass', |
|
97
|
|
|
)); |
|
98
|
|
|
$this->assertEquals($expect, $ancestry); |
|
99
|
|
|
|
|
100
|
|
|
ClassInfo::reset_db_cache(); |
|
101
|
|
|
$this->assertEquals($expect, ClassInfo::ancestry('classINFOTest_Childclass')); |
|
102
|
|
|
|
|
103
|
|
|
ClassInfo::reset_db_cache(); |
|
104
|
|
|
$this->assertEquals($expect, ClassInfo::ancestry('classINFOTest_Childclass')); |
|
105
|
|
|
|
|
106
|
|
|
ClassInfo::reset_db_cache(); |
|
107
|
|
|
$ancestry = ClassInfo::ancestry('ClassInfoTest_ChildClass', true); |
|
108
|
|
|
$this->assertEquals(array('ClassInfoTest_BaseClass' => 'ClassInfoTest_BaseClass'), $ancestry, |
|
109
|
|
|
'$tablesOnly option excludes memory-only inheritance classes' |
|
110
|
|
|
); |
|
111
|
|
|
} |
|
112
|
|
|
|
|
113
|
|
|
/** |
|
114
|
|
|
* @covers ClassInfo::dataClassesFor() |
|
115
|
|
|
*/ |
|
116
|
|
|
public function testDataClassesFor() { |
|
117
|
|
|
$expect = array( |
|
118
|
|
|
'ClassInfoTest_BaseDataClass' => 'ClassInfoTest_BaseDataClass', |
|
119
|
|
|
'ClassInfoTest_HasFields' => 'ClassInfoTest_HasFields', |
|
120
|
|
|
'ClassInfoTest_WithRelation' => 'ClassInfoTest_WithRelation', |
|
121
|
|
|
'ClassInfoTest_WithCustomTable' => 'ClassInfoTest_WithCustomTable', |
|
122
|
|
|
); |
|
123
|
|
|
|
|
124
|
|
|
$classes = array( |
|
125
|
|
|
'ClassInfoTest_BaseDataClass', |
|
126
|
|
|
'ClassInfoTest_NoFields', |
|
127
|
|
|
'ClassInfoTest_HasFields', |
|
128
|
|
|
); |
|
129
|
|
|
|
|
130
|
|
|
ClassInfo::reset_db_cache(); |
|
131
|
|
|
$this->assertEquals($expect, ClassInfo::dataClassesFor($classes[0])); |
|
132
|
|
|
ClassInfo::reset_db_cache(); |
|
133
|
|
|
$this->assertEquals($expect, ClassInfo::dataClassesFor(strtoupper($classes[0]))); |
|
134
|
|
|
ClassInfo::reset_db_cache(); |
|
135
|
|
|
$this->assertEquals($expect, ClassInfo::dataClassesFor($classes[1])); |
|
136
|
|
|
|
|
137
|
|
|
$expect = array( |
|
138
|
|
|
'ClassInfoTest_BaseDataClass' => 'ClassInfoTest_BaseDataClass', |
|
139
|
|
|
'ClassInfoTest_HasFields' => 'ClassInfoTest_HasFields', |
|
140
|
|
|
); |
|
141
|
|
|
|
|
142
|
|
|
ClassInfo::reset_db_cache(); |
|
143
|
|
|
$this->assertEquals($expect, ClassInfo::dataClassesFor($classes[2])); |
|
144
|
|
|
ClassInfo::reset_db_cache(); |
|
145
|
|
|
$this->assertEquals($expect, ClassInfo::dataClassesFor(strtolower($classes[2]))); |
|
146
|
|
|
} |
|
147
|
|
|
|
|
148
|
|
|
} |
|
149
|
|
|
|
|
150
|
|
|
/** |
|
151
|
|
|
* @package framework |
|
152
|
|
|
* @subpackage tests |
|
153
|
|
|
*/ |
|
154
|
|
|
|
|
155
|
|
|
class ClassInfoTest_BaseClass extends DataObject implements TestOnly { |
|
156
|
|
|
|
|
157
|
|
|
} |
|
158
|
|
|
|
|
159
|
|
|
/** |
|
160
|
|
|
* @package framework |
|
161
|
|
|
* @subpackage tests |
|
162
|
|
|
*/ |
|
163
|
|
|
|
|
164
|
|
|
class ClassInfoTest_ChildClass extends ClassInfoTest_BaseClass { |
|
165
|
|
|
|
|
166
|
|
|
} |
|
167
|
|
|
|
|
168
|
|
|
/** |
|
169
|
|
|
* @package framework |
|
170
|
|
|
* @subpackage tests |
|
171
|
|
|
*/ |
|
172
|
|
|
|
|
173
|
|
|
class ClassInfoTest_GrandChildClass extends ClassInfoTest_ChildClass { |
|
174
|
|
|
|
|
175
|
|
|
} |
|
176
|
|
|
|
|
177
|
|
|
/** |
|
178
|
|
|
* @package framework |
|
179
|
|
|
* @subpackage tests |
|
180
|
|
|
*/ |
|
181
|
|
|
|
|
182
|
|
|
class ClassInfoTest_BaseDataClass extends DataObject implements TestOnly { |
|
183
|
|
|
|
|
184
|
|
|
private static $db = array( |
|
185
|
|
|
'Title' => 'Varchar' |
|
186
|
|
|
); |
|
187
|
|
|
} |
|
188
|
|
|
|
|
189
|
|
|
/** |
|
190
|
|
|
* @package framework |
|
191
|
|
|
* @subpackage tests |
|
192
|
|
|
*/ |
|
193
|
|
|
|
|
194
|
|
|
class ClassInfoTest_NoFields extends ClassInfoTest_BaseDataClass { |
|
195
|
|
|
|
|
196
|
|
|
} |
|
197
|
|
|
|
|
198
|
|
|
/** |
|
199
|
|
|
* @package framework |
|
200
|
|
|
* @subpackage tests |
|
201
|
|
|
*/ |
|
202
|
|
|
|
|
203
|
|
|
class ClassInfoTest_HasFields extends ClassInfoTest_NoFields { |
|
204
|
|
|
|
|
205
|
|
|
private static $db = array( |
|
206
|
|
|
'Description' => 'Varchar' |
|
207
|
|
|
); |
|
208
|
|
|
} |
|
209
|
|
|
|
|
210
|
|
|
class ClassInfoTest_WithCustomTable extends ClassInfoTest_NoFields { |
|
211
|
|
|
private static $table_name = 'CITWithCustomTable'; |
|
212
|
|
|
private static $db = array( |
|
213
|
|
|
'Description' => 'Text' |
|
214
|
|
|
); |
|
215
|
|
|
} |
|
216
|
|
|
|
|
217
|
|
|
/** |
|
218
|
|
|
* @package framework |
|
219
|
|
|
* @subpackage tests |
|
220
|
|
|
*/ |
|
221
|
|
|
|
|
222
|
|
|
class ClassInfoTest_WithRelation extends ClassInfoTest_NoFields { |
|
223
|
|
|
|
|
224
|
|
|
private static $has_one = array( |
|
225
|
|
|
'Relation' => 'ClassInfoTest_HasFields' |
|
226
|
|
|
); |
|
227
|
|
|
} |
|
228
|
|
|
|
Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.
The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.
This check looks for comments that seem to be mostly valid code and reports them.