MyDSL/tests/Token/TokenInterfaceTest.php
2021-01-22 17:00:16 +08:00

99 lines
3.4 KiB
PHP

<?php
/**
* @filename TokenInterfaceTest.php
* @author Jerry Yan <792602257@qq.com>
* @date 2021/1/22 13:52
*/
namespace JerryYan\DSL\Test\Token;
use JerryYan\DSL\Token\TokenLogicAnd;
use JerryYan\DSL\Token\TokenLogicEqual;
use JerryYan\DSL\Token\TokenUseVariable;
use JerryYan\DSL\Token\TokenInterface;
use JerryYan\DSL\Token\TokenLogicOr;
use JerryYan\DSL\Token\TokenUndefined;
use JerryYan\DSL\Token\TokenVariable;
use PHPUnit\Framework\TestCase;
class TokenInterfaceTest extends TestCase
{
/** @var class-string<TokenInterface>[] TokenClass */
private $tokenTypes = [
TokenLogicAnd::class,
TokenLogicEqual::class,
TokenUseVariable::class,
TokenLogicOr::class,
TokenUndefined::class,
TokenVariable::class,
];
protected $chainFirst;
protected $chainLast;
protected function setUp(): void
{
/** @var ?TokenInterface $last */
$last = NULL;
foreach ($this->tokenTypes as $cls) {
/** @var TokenInterface $current */
$current = new $cls('');
$current->setPrevToken($last);
if ($last !== NULL) $last->setNextToken($current);
$last = $current;
}
$this->chainLast = $last;
$this->chainFirst = $last->getFirstToken();
}
public function testGetFirstToken()
{
$this->assertInstanceOf($this->tokenTypes[0], $this->chainLast->getFirstToken(), '链表头类型非预期');
}
public function testGetPrevToken()
{
$this->assertInstanceOf($this->tokenTypes[count($this->tokenTypes)-2], $this->chainLast->getPrevToken(), '链表尾前一类型非预期');
$this->assertNull($this->chainFirst->getPrevToken(), '链表头前一类型非空');
}
public function testCount()
{
$this->assertEquals($this->chainFirst->count(), $this->chainLast->count(), '链表头尾计数不同');
$this->assertEquals(count($this->tokenTypes), $this->chainLast->count(), '链表尾的长度不同');
}
public function testGetNextToken()
{
$this->assertInstanceOf($this->tokenTypes[1], $this->chainFirst->getNextToken(), '链表头后一类型非预期');
$this->assertNull($this->chainLast->getNextToken(), '链表尾前一类型非空');
}
public function testGetLastToken()
{
$this->assertInstanceOf($this->tokenTypes[count($this->tokenTypes)-1], $this->chainFirst->getLastToken(), '链表尾类型非预期');
}
public function testHasPrevToken()
{
$this->assertTrue($this->chainLast->hasPrevToken());
$this->assertFalse($this->chainFirst->hasPrevToken());
}
public function testHasNextToken()
{
$this->assertTrue($this->chainFirst->hasNextToken());
$this->assertFalse($this->chainLast->hasNextToken());
}
public function testGetNextTokenLength()
{
$this->assertEquals(count($this->tokenTypes) - 2, $this->chainFirst->getNextToken()->getNextTokenLength(), '链表头后一后长度不对');
$this->assertEquals(0, $this->chainLast->getNextTokenLength(), '链表尾后长度不对');
}
public function testGetPrevTokenLength()
{
$this->assertEquals(count($this->tokenTypes) - 2, $this->chainLast->getPrevToken()->getPrevTokenLength(), '链表尾前一前长度不对');
$this->assertEquals(0, $this->chainFirst->getPrevTokenLength(), '链表头前长度不对');
}
}