mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-08-29 22:16:01 +02:00
This is used to get the classname out of the tokens, rather than assuming that the class name is a single T_STRING.
270 lines
6.1 KiB
PHP
270 lines
6.1 KiB
PHP
<?php
|
|
|
|
class ConfigStaticManifestTest extends SapphireTest {
|
|
|
|
/* Example statics */
|
|
|
|
// Different access levels
|
|
static $nolevel;
|
|
public static $public;
|
|
protected static $protected;
|
|
private static $private;
|
|
static public $public2;
|
|
static protected $protected2;
|
|
static private $private2;
|
|
static $nolevel_after_private;
|
|
|
|
// Assigning values
|
|
static $snone;
|
|
static $snull = null;
|
|
static $sint = 1;
|
|
static $sfloat = 2.5;
|
|
static $sstring = 'string';
|
|
static $sarray = array(1, 2, array(3, 4), 5);
|
|
static $sheredoc = <<<DOC
|
|
heredoc
|
|
DOC;
|
|
static $snowdoc = <<<'DOC'
|
|
nowdoc
|
|
DOC;
|
|
|
|
// @codingStandardsIgnoreStart
|
|
// Assigning multiple values
|
|
static $onone, $onull = null, $oint = 1, $ofloat = 2.5, $ostring = 'string', $oarray = array(1, 2, array(3, 4), 5), $oheredoc = <<<DOC
|
|
heredoc
|
|
DOC
|
|
, $onowdoc = <<<'DOC'
|
|
nowdoc
|
|
DOC;
|
|
// @codingStandardsIgnoreEnd
|
|
|
|
static
|
|
$mnone,
|
|
$mnull = null,
|
|
$mint = 1,
|
|
$mfloat = 2.5,
|
|
$mstring = 'string',
|
|
$marray = array(
|
|
1, 2,
|
|
array(3, 4),
|
|
5
|
|
),
|
|
$mheredoc = <<<DOC
|
|
heredoc
|
|
DOC
|
|
,
|
|
$mnowdoc = <<<'DOC'
|
|
nowdoc
|
|
DOC;
|
|
|
|
|
|
static /* Has comment inline */ $commented_int = 1, /* And here */ $commented_string = 'string';
|
|
|
|
static
|
|
/**
|
|
* Has docblock inline
|
|
*/
|
|
$docblocked_int = 1,
|
|
/** And here */
|
|
$docblocked_string = 'string';
|
|
|
|
// Should ignore static methpds
|
|
static function static_method() {}
|
|
|
|
// Should ignore method statics
|
|
function instanceMethod() {
|
|
static $method_static;
|
|
}
|
|
|
|
/* The tests */
|
|
|
|
protected function parseSelf() {
|
|
static $statics = null;
|
|
|
|
if ($statics === null) {
|
|
$parser = new SS_ConfigStaticManifest_Parser(__FILE__);
|
|
$parser->parse();
|
|
}
|
|
|
|
return $parser;
|
|
}
|
|
|
|
public function testParsingAccessLevels() {
|
|
$statics = $this->parseSelf()->getStatics();
|
|
|
|
$levels = array(
|
|
'nolevel' => null,
|
|
'public' => T_PUBLIC,
|
|
'public2' => T_PUBLIC,
|
|
'protected' => T_PROTECTED,
|
|
'protected2' => T_PROTECTED,
|
|
'private' => T_PRIVATE,
|
|
'private2' => T_PRIVATE,
|
|
'nolevel_after_private' => null
|
|
);
|
|
|
|
foreach($levels as $var => $level) {
|
|
$this->assertEquals(
|
|
$level,
|
|
$statics[__CLASS__][$var]['access'],
|
|
'Variable '.$var.' has '.($level ? token_name($level) : 'no').' access level'
|
|
);
|
|
}
|
|
}
|
|
|
|
public function testParsingValues() {
|
|
$statics = $this->parseSelf()->getStatics();
|
|
|
|
// Check assigning values
|
|
$values = array(
|
|
'none',
|
|
'null',
|
|
'int',
|
|
'float',
|
|
'string',
|
|
'array',
|
|
'heredoc',
|
|
'nowdoc'
|
|
);
|
|
|
|
$prepends = array(
|
|
's', // Each on it's own
|
|
'o', // All on one line
|
|
'm' // All in on static statement, but each on own line
|
|
);
|
|
|
|
foreach ($values as $value) {
|
|
foreach ($prepends as $prepend) {
|
|
$var = "$prepend$value";
|
|
|
|
$this->assertEquals(
|
|
self::$$var,
|
|
$statics[__CLASS__][$var]['value'],
|
|
'Variable '.$var.' value is extracted properly'
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
public function testIgnoreComments() {
|
|
$statics = $this->parseSelf()->getStatics();
|
|
|
|
$this->assertEquals(self::$commented_int, $statics[__CLASS__]['commented_int']['value']);
|
|
$this->assertEquals(self::$commented_string, $statics[__CLASS__]['commented_string']['value']);
|
|
|
|
$this->assertEquals(self::$docblocked_int, $statics[__CLASS__]['docblocked_int']['value']);
|
|
$this->assertEquals(self::$docblocked_string, $statics[__CLASS__]['docblocked_string']['value']);
|
|
}
|
|
|
|
public function testIgnoresMethodStatics() {
|
|
$statics = $this->parseSelf()->getStatics();
|
|
$this->assertNull(@$statics[__CLASS__]['method_static']);
|
|
}
|
|
|
|
public function testIgnoresStaticMethods() {
|
|
$statics = $this->parseSelf()->getStatics();
|
|
$this->assertNull(@$statics[__CLASS__]['static_method']);
|
|
}
|
|
|
|
public function testParsingShortArray() {
|
|
if(version_compare(PHP_VERSION, '5.4', '<')) {
|
|
$this->markTestSkipped('This test requires PHP 5.4 or higher');
|
|
return;
|
|
}
|
|
|
|
$parser = new SS_ConfigStaticManifest_Parser(__DIR__ .
|
|
'/ConfigStaticManifestTest/ConfigStaticManifestTestMyObject.php');
|
|
$parser->parse();
|
|
|
|
$statics = $parser->getStatics();
|
|
|
|
$expectedValue = array(
|
|
'Name' => 'Varchar',
|
|
'Description' => 'Text',
|
|
);
|
|
|
|
$this->assertEquals($expectedValue, $statics['ConfigStaticManifestTestMyObject']['db']['value']);
|
|
}
|
|
|
|
public function testParsingNamespacesclass() {
|
|
$parser = new SS_ConfigStaticManifest_Parser(__DIR__ .
|
|
'/ConfigStaticManifestTest/ConfigStaticManifestTestNamespace.php');
|
|
$parser->parse();
|
|
|
|
$statics = $parser->getStatics();
|
|
|
|
$expectedValue = array(
|
|
'Name' => 'Varchar',
|
|
'Description' => 'Text',
|
|
);
|
|
|
|
$this->assertEquals($expectedValue, $statics['config\staticmanifest\NamespaceTest']['db']['value']);
|
|
}
|
|
|
|
public function testParsingMultyStringClass() {
|
|
static $tokens = array(
|
|
array(T_OPEN_TAG, "<?php\n", 1),
|
|
array(T_WHITESPACE, "\n", 2),
|
|
array(T_CLASS, 'class', 3),
|
|
array(T_WHITESPACE, ' ', 3),
|
|
':',
|
|
array(T_STRING, 'ss', 3),
|
|
':',
|
|
array(T_STRING, 'test2', 3),
|
|
array(T_WHITESPACE, ' ', 3),
|
|
array(T_EXTENDS, 'extends', 3),
|
|
array(T_WHITESPACE, ' ', 3),
|
|
':',
|
|
array(T_STRING, 'ss', 3),
|
|
':',
|
|
array(T_STRING, 'test', 3),
|
|
array(T_WHITESPACE, ' ', 3),
|
|
array(T_IMPLEMENTS, 'implements', 3),
|
|
array(T_WHITESPACE, ' ', 3),
|
|
array(T_STRING, 'TestOnly', 3),
|
|
array(T_WHITESPACE, ' ', 3),
|
|
'{',
|
|
array(T_WHITESPACE, "\n\t", 3),
|
|
array(T_PRIVATE, 'private', 4),
|
|
array(T_WHITESPACE, ' ', 4),
|
|
array(T_STATIC, 'static', 4),
|
|
array(T_WHITESPACE, ' ', 4),
|
|
array(T_VARIABLE, '$test', 4),
|
|
array(T_WHITESPACE, ' ', 4),
|
|
'=',
|
|
array(T_WHITESPACE, ' ', 4),
|
|
array(T_ARRAY, 'array', 4),
|
|
'(',
|
|
array(T_LNUMBER, '3', 4),
|
|
')',
|
|
';',
|
|
array(T_WHITESPACE, "\n", 4),
|
|
'}',
|
|
array(T_WHITESPACE, "\n", 5),
|
|
);
|
|
|
|
$parser = new ConfigStaticManifestTest_Parser($tokens);
|
|
$parser->parse();
|
|
|
|
$statics = $parser->getStatics();
|
|
|
|
$expected = array(
|
|
'test' => array(
|
|
'access' => T_PRIVATE,
|
|
'value' => array(3)
|
|
)
|
|
);
|
|
|
|
$this->assertEquals($expected, $statics[':ss:test2']);
|
|
}
|
|
}
|
|
|
|
class ConfigStaticManifestTest_Parser extends SS_ConfigStaticManifest_Parser implements TestOnly {
|
|
public function __construct($tokens) {
|
|
$this->path = __FILE__;
|
|
$this->tokens = $tokens;
|
|
$this->length = count($this->tokens);
|
|
$this->pos = 0;
|
|
}
|
|
}
|