Files
MyDSL/tests/Reader/StringReaderTest.php
2021-01-26 14:53:06 +08:00

146 lines
6.0 KiB
PHP

<?php
/**
* @filename StringReaderTest.php
* @author Jerry Yan <792602257@qq.com>
* @date 2020/12/18 12:19
*/
namespace JerryYan\DSL\Test\Reader;
use JerryYan\DSL\Reader\ReaderInterface;
use JerryYan\DSL\Reader\StringReader;
use PHPUnit\Framework\TestCase;
class StringReaderTest extends TestCase
{
/** @var ReaderInterface[] */
protected $readerArray = [];
protected $things = [
[
'original' => " Ahhh This Is 一个 新的 TOken",
'tokens' => ["Ahhh", "This", "Is", "一个", "新的", "TOken"],
'nextTokens' => ["This", "Is", "一个", "新的", "TOken", ""],
'positions' => [1, 7, 12, 15, 18, 21],
'lines' => [1, 1, 1, 1, 1, 1],
'linePositions' => [1, 7, 12, 15, 18, 21],
'moveToNextLines' => [],
],
[
'original' => " 中文 \r\n\r 这是 \r Is A \n\n 一个\n新的 TOken",
'tokens' => ["中文", "这是", "Is", "A", "一个", "新的", "TOken"],
'nextTokens' => ["这是", "Is", "A", "一个", "新的", "TOken", ""],
'positions' => [1, 8, 13, 16, 21, 24, 27],
'lines' => [1, 3, 4, 4, 6, 7, 7],
'linePositions' => [1, 1, 1, 4, 1, 0, 3],
'moveToNextLines' => [1, 2, 4, 5],
]
];
protected function setUp(): void
{
foreach ($this->things as $thing) {
$this->readerArray[] = new StringReader($thing['original']);
}
}
public function testGetNextChar()
{
foreach ($this->things as $index=>$thing) {
$reader = $this->readerArray[$index];
$reader->reset();
$this->assertEquals(mb_substr(trim($thing['original']), 0, 1), $reader->getNextChar(), "不匹配");
$this->assertEquals($thing['positions'][0], $reader->getCurrentPosition(), "CurPos与预计不符");
}
}
public function testGetCurrentToken()
{
foreach ($this->things as $index=>$thing) {
$reader = $this->readerArray[$index];
$reader->reset();
$this->assertEquals($thing['positions'][0], $reader->getCurrentPosition(), "CurPos与预计不符");
$this->assertEquals($thing['tokens'][0], $reader->getCurrentToken(), "不匹配");
}
}
/**
* 移动至下一个Token
* @author Jerry Yan <792602257@qq.com>
* @date 2020/12/18 14:16
* @depends testGetNextChar
* @depends testGetCurrentToken
* @depends testGetNextToken
*/
public function testMoveToNextToken()
{
foreach ($this->things as $index=>$thing) {
$reader = $this->readerArray[$index];
$reader->reset();
foreach ($thing['nextTokens'] as $key=> $nextToken){
$oldCurToken = $reader->getCurrentToken();
$oldNextPos = $reader->getNextPosition();
$oldNextToken = $reader->getNextToken();
$this->assertEquals($nextToken, $oldNextToken, "不匹配");
$this->assertEquals($thing['positions'][$key], $reader->getCurrentPosition(), "CurPos与预计不符");
$this->assertEquals($thing['lines'][$key], $reader->getCurrentLine(), "CurLine与预计不符");
$this->assertEquals($thing['linePositions'][$key], $reader->getCurrentLinePosition(), "CLPos与预计不符");
$hasNext = $reader->moveToNextToken();
if ($hasNext) {
$this->assertNotEquals($oldCurToken, $reader->getCurrentToken(), "CurToken与旧CurToken相同");
$this->assertNotEquals($oldNextPos, $reader->getNextPosition(), "NextPos与旧NextPos相同");
$this->assertNotEquals($reader->getNextPosition(), $reader->getCurrentPosition(), "CurPos与NextPos相同");
}
}
}
}
/**
* 获取下一个Token,重复调用均为同一结果
* @author Jerry Yan <792602257@qq.com>
* @date 2020/12/18 18:49
*/
public function testGetNextToken()
{
foreach ($this->things as $index=>$thing) {
$reader = $this->readerArray[$index];
$reader->reset();
$nextPos = $reader->getNextPosition();
$string = $reader->getNextToken();
$this->assertEquals($string, $reader->getNextToken(), "不匹配");
$this->assertEquals($reader->getNextToken(), $reader->getNextToken(), "不匹配");
$this->assertEquals($nextPos, $reader->getNextPosition(), "NextPos不可以发生变化");
}
}
public function testSkipCurrentLine()
{
foreach ($this->things as $index=>$thing) {
$reader = $this->readerArray[$index];
$reader->reset();
foreach ($thing['moveToNextLines'] as $key){
$reader->skipCurrentLine();
$this->assertEquals($thing['lines'][$key], $reader->getCurrentLine(), "行号不匹配");
$this->assertEquals($thing['linePositions'][$key], $reader->getCurrentLinePosition(), "CLPos不匹配");
$this->assertEquals($thing['tokens'][$key], $reader->getCurrentToken(), "Token不匹配");
$this->assertEquals($thing['positions'][$key], $reader->getCurrentPosition(), "CurPos不匹配");
$this->assertEquals($thing['nextTokens'][$key], $reader->getNextToken(), "NextToken不匹配");
}
}
}
public function testResetCursor()
{
foreach ($this->things as $index=>$thing) {
$reader = $this->readerArray[$index];
$reader->moveToNextToken();
$curPos = $reader->getCurrentPosition();
$nextPos = $reader->getNextPosition();
$string = $reader->getCurrentToken();
$reader->resetCursor();
$this->assertNotEquals($curPos, $reader->getCurrentPosition(), "CurPos未发生变化");
$this->assertNotEquals($nextPos, $reader->getNextPosition(), "NextPos未发生变化");
$this->assertNotEquals($string, $reader->getCurrentToken(), "CurToken未发生变化");
}
}
}