silverstripe-framework/tests/core/manifest/ConfigStaticManifestTest.php

280 lines
6.4 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']);
}
public function testParsingClassKeyword() {
$parser = new SS_ConfigStaticManifest_Parser(__DIR__ .
'/ConfigStaticManifestTest/ConfigStaticManifestTestClassKeyword.php');
$parser->parse();
$statics = $parser->getStatics();
$this->assertEquals('bar', $statics['ConfigStaticManifestTestClassKeyword']['foo']['value']);
}
}
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;
}
}