Completed
Push — master ( 9e3f76...51d53f )
by Hamish
10:45
created

ClassInfoTest::testClassName()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 4
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 6
rs 9.4285
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);
0 ignored issues
show
Unused Code Comprehensibility introduced by
55% of this comment could be valid code. Did you maybe forget this after debugging?

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.

Loading history...
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