<?php
/**
 * @filename TokenizerTest.php
 * @author Jerry Yan <792602257@qq.com>
 * @date 2021/1/22 13:33
 */

namespace JerryYan\DSL\Test\Tokenizer;

use JerryYan\DSL\Grammar\DefaultGrammar;
use JerryYan\DSL\Reader\StringReader;
use JerryYan\DSL\Token\TokenCurry;
use JerryYan\DSL\Token\TokenLogicAnd;
use JerryYan\DSL\Token\TokenInterface;
use JerryYan\DSL\Token\TokenLogicEqual;
use JerryYan\DSL\Token\TokenLogicFake;
use JerryYan\DSL\Token\TokenLogicNotEqual;
use JerryYan\DSL\Token\TokenLogicOr;
use JerryYan\DSL\Token\TokenNumber;
use JerryYan\DSL\Token\TokenVariable;
use JerryYan\DSL\Tokenizer\Tokenizer;
use PHPUnit\Framework\TestCase;

class TokenizerTest extends TestCase
{
    protected $tokenizer;
    protected $reader;
    private $text = "当 另外那个 与 另外一个 不相等时 或者 那个 和 这个 等于 -0.5 的时候";
    /** @var class-string<TokenInterface>[] 预期的类型 */
    private $textTokenType = [
        TokenLogicFake::class,
        TokenVariable::class,
        TokenCurry::class,
        TokenVariable::class,
        TokenLogicNotEqual::class,
        TokenLogicOr::class,
        TokenVariable::class,
        TokenLogicAnd::class,
        TokenVariable::class,
        TokenLogicEqual::class,
        TokenNumber::class,
        TokenLogicFake::class,
    ];
    protected function setUp(): void
    {
        $this->tokenizer = new Tokenizer(new DefaultGrammar());
        $this->reader = new StringReader($this->text);
    }

    public function testTokenize()
    {
        $tokens = $this->tokenizer->tokenize($this->reader);
        $this->assertInstanceOf(TokenInterface::class, $tokens);
        $index = 0;
        do {
            $this->assertInstanceOf($this->textTokenType[$index], $tokens);
            $tokens = $tokens->getNextToken();
            $index ++;
        } while ($tokens->hasNextToken());
    }
}