162 lines
5.0 KiB
PHP
162 lines
5.0 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace PhpParser;
|
||
|
|
||
|
class DummyNode extends NodeAbstract {
|
||
|
public $subNode1;
|
||
|
public $subNode2;
|
||
|
|
||
|
public function __construct($subNode1, $subNode2, $attributes) {
|
||
|
parent::__construct(null, $attributes);
|
||
|
$this->subNode1 = $subNode1;
|
||
|
$this->subNode2 = $subNode2;
|
||
|
}
|
||
|
|
||
|
public function getSubNodeNames() {
|
||
|
return array('subNode1', 'subNode2');
|
||
|
}
|
||
|
|
||
|
// This method is only overwritten because the node is located in an unusual namespace
|
||
|
public function getType() {
|
||
|
return 'Dummy';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class NodeAbstractTest extends \PHPUnit_Framework_TestCase
|
||
|
{
|
||
|
public function provideNodes() {
|
||
|
$attributes = array(
|
||
|
'startLine' => 10,
|
||
|
'comments' => array(
|
||
|
new Comment('// Comment' . "\n"),
|
||
|
new Comment\Doc('/** doc comment */'),
|
||
|
),
|
||
|
);
|
||
|
|
||
|
$node1 = $this->getMockForAbstractClass(
|
||
|
'PhpParser\NodeAbstract',
|
||
|
array(
|
||
|
array(
|
||
|
'subNode1' => 'value1',
|
||
|
'subNode2' => 'value2',
|
||
|
),
|
||
|
$attributes
|
||
|
),
|
||
|
'PhpParser_Node_Dummy'
|
||
|
);
|
||
|
$node1->notSubNode = 'value3';
|
||
|
|
||
|
$node2 = new DummyNode('value1', 'value2', $attributes);
|
||
|
$node2->notSubNode = 'value3';
|
||
|
|
||
|
return array(
|
||
|
array($attributes, $node1),
|
||
|
array($attributes, $node2),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @dataProvider provideNodes
|
||
|
*/
|
||
|
public function testConstruct(array $attributes, Node $node) {
|
||
|
$this->assertSame('Dummy', $node->getType());
|
||
|
$this->assertSame(array('subNode1', 'subNode2'), $node->getSubNodeNames());
|
||
|
$this->assertSame(10, $node->getLine());
|
||
|
$this->assertSame('/** doc comment */', $node->getDocComment()->getText());
|
||
|
$this->assertSame('value1', $node->subNode1);
|
||
|
$this->assertSame('value2', $node->subNode2);
|
||
|
$this->assertTrue(isset($node->subNode1));
|
||
|
$this->assertTrue(isset($node->subNode2));
|
||
|
$this->assertFalse(isset($node->subNode3));
|
||
|
$this->assertSame($attributes, $node->getAttributes());
|
||
|
|
||
|
return $node;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @dataProvider provideNodes
|
||
|
*/
|
||
|
public function testGetDocComment(array $attributes, Node $node) {
|
||
|
$this->assertSame('/** doc comment */', $node->getDocComment()->getText());
|
||
|
array_pop($node->getAttribute('comments')); // remove doc comment
|
||
|
$this->assertNull($node->getDocComment());
|
||
|
array_pop($node->getAttribute('comments')); // remove comment
|
||
|
$this->assertNull($node->getDocComment());
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @dataProvider provideNodes
|
||
|
*/
|
||
|
public function testChange(array $attributes, Node $node) {
|
||
|
// change of line
|
||
|
$node->setLine(15);
|
||
|
$this->assertSame(15, $node->getLine());
|
||
|
|
||
|
// direct modification
|
||
|
$node->subNode = 'newValue';
|
||
|
$this->assertSame('newValue', $node->subNode);
|
||
|
|
||
|
// indirect modification
|
||
|
$subNode =& $node->subNode;
|
||
|
$subNode = 'newNewValue';
|
||
|
$this->assertSame('newNewValue', $node->subNode);
|
||
|
|
||
|
// removal
|
||
|
unset($node->subNode);
|
||
|
$this->assertFalse(isset($node->subNode));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @dataProvider provideNodes
|
||
|
*/
|
||
|
public function testIteration(array $attributes, Node $node) {
|
||
|
// Iteration is simple object iteration over properties,
|
||
|
// not over subnodes
|
||
|
$i = 0;
|
||
|
foreach ($node as $key => $value) {
|
||
|
if ($i === 0) {
|
||
|
$this->assertSame('subNode1', $key);
|
||
|
$this->assertSame('value1', $value);
|
||
|
} else if ($i === 1) {
|
||
|
$this->assertSame('subNode2', $key);
|
||
|
$this->assertSame('value2', $value);
|
||
|
} else if ($i === 2) {
|
||
|
$this->assertSame('notSubNode', $key);
|
||
|
$this->assertSame('value3', $value);
|
||
|
} else {
|
||
|
throw new \Exception;
|
||
|
}
|
||
|
$i++;
|
||
|
}
|
||
|
$this->assertSame(3, $i);
|
||
|
}
|
||
|
|
||
|
public function testAttributes() {
|
||
|
/** @var $node Node */
|
||
|
$node = $this->getMockForAbstractClass('PhpParser\NodeAbstract');
|
||
|
|
||
|
$this->assertEmpty($node->getAttributes());
|
||
|
|
||
|
$node->setAttribute('key', 'value');
|
||
|
$this->assertTrue($node->hasAttribute('key'));
|
||
|
$this->assertSame('value', $node->getAttribute('key'));
|
||
|
|
||
|
$this->assertFalse($node->hasAttribute('doesNotExist'));
|
||
|
$this->assertNull($node->getAttribute('doesNotExist'));
|
||
|
$this->assertSame('default', $node->getAttribute('doesNotExist', 'default'));
|
||
|
|
||
|
$node->setAttribute('null', null);
|
||
|
$this->assertTrue($node->hasAttribute('null'));
|
||
|
$this->assertNull($node->getAttribute('null'));
|
||
|
$this->assertNull($node->getAttribute('null', 'default'));
|
||
|
|
||
|
$this->assertSame(
|
||
|
array(
|
||
|
'key' => 'value',
|
||
|
'null' => null,
|
||
|
),
|
||
|
$node->getAttributes()
|
||
|
);
|
||
|
}
|
||
|
}
|