<?php

namespace Onoi\Tesa\Tests\Integration;

use Onoi\Tesa\SanitizerFactory;
use PHPUnit\Framework\TestCase;

/**
 * @group onoi-tesa
 *
 * @license GPL-2.0-or-later
 * @since 0.1
 *
 * @author mwjames
 */
class JaTokenizerTest extends TestCase {

	/**
	 * @dataProvider icuTextProvider
	 */
	public function testIcuWordBoundaryTokenizer( $text, $expected ) {
		$sanitizerFactory = new SanitizerFactory();

		$tokenier = $sanitizerFactory->newIcuWordBoundaryTokenizer(
			$sanitizerFactory->newGenericRegExTokenizer()
		);

		if ( !$tokenier->isAvailable() ) {
			$this->markTestSkipped( 'ICU extension is not available.' );
		}

		$this->assertEquals(
			$expected,
			$tokenier->tokenize( $text )
		);
	}

	/**
	 * @dataProvider tinyTextProvider
	 */
	public function testJaTinySegmenterTokenizer( $text, $expected ) {
		$sanitizerFactory = new SanitizerFactory();

		$tokenier = $sanitizerFactory->newJaTinySegmenterTokenizer(
			 $sanitizerFactory->newPunctuationRegExTokenizer()
		);

		$this->assertEquals(
			$expected,
			$tokenier->tokenize( $text )
		);
	}

	public function icuTextProvider() {
		// https://github.com/NaturalNode/natural/blob/master/spec/tokenizer_ja_spec.js

		$provider[] = [
			"計算機科学における字句解析 (じくかいせき、英: Lexical Analysis) とは、ソースコードを構成する文字の並びを、トークン (token) の並びに変換することをいう。\n" .
			"ここでいう「トークン」とは、意味を持つコードの最小単位のこと。字句解析を行うプログラムは、字句解析器 (lexical analyzer, 略称：lexer) と呼ばれる。\n" .
			"字句解析器はスキャナ (scanner) とトークナイザ (tokenizer) から構成される。\n",
			//
			[
				'計算機', '科学', 'における', '字句', '解析', 'じ', 'く', 'かい',
				'せき', '、', '英', 'Lexical', 'Analysis', 'と', 'は', '、', 'ソース', 'コード', 'を',
				'構成', 'する', '文字', 'の', '並び', 'を', '、', 'トーク',
				'ン', 'token', 'の', '並びに', '変換', 'する', 'こと', 'を',
				'いう', '。', 'ここ', 'で', 'いう', '「', 'トーク', 'ン',
				'」', 'と', 'は', '、', '意味', 'を', '持つ', 'コード',
				'の', '最小', '単位', 'の', 'こと', '。', '字句', '解析',
				'を', '行う', 'プログラム', 'は', '、', '字句', '解析', '器',
				'lexical', 'analyzer', '略称', '：',
				'lexer', 'と', '呼ばれる', '。', '字句', '解析', '器', 'は',
				'スキャナ', 'scanner', 'と', 'トーク', 'ナ', 'イザ', 'tokenizer', 'から',
				'構成', 'さ', 'れる', '。'
			]
		];

		return $provider;
	}

	public function tinyTextProvider() {
		// https://github.com/NaturalNode/natural/blob/master/spec/tokenizer_ja_spec.js
		/*
			['計算', '機科', '学', 'に', 'おける', '字句', '解析',
			'じくかい', 'せき', '英', 'Lexical', 'Analysis', 'と', 'は', 'ソースコード',
			'を', '構成', 'する', '文字', 'の', '並び', 'を', 'トークン', 'token', 'の',
			'並び', 'に', '変換', 'する', 'こと', 'を', 'いう', 'ここ', 'でいう', 'トークン',
			'と', 'は', '意味', 'を', '持つ', 'コード', 'の', '最小', '単位', 'の', 'こと',
			'字句', '解析', 'を', '行う', 'プログラム', 'は', '字句', '解析', '器', 'lexical',
			'analyzer', '略称', 'lexer', 'と', '呼ば', 'れる', '字句', '解析', '器', 'は',
			'スキャナ', 'scanner', 'と', 'トークナイザ', 'tokenizer', 'から', '構成', 'さ',
			'れる']
		 */

		$provider[] = [
			"計算機科学における字句解析 (じくかいせき、英: Lexical Analysis) とは、ソースコードを構成する文字の並びを、トークン (token) の並びに変換することをいう。\n" .
			"ここでいう「トークン」とは、意味を持つコードの最小単位のこと。字句解析を行うプログラムは、字句解析器 (lexical analyzer, 略称：lexer) と呼ばれる。\n" .
			"字句解析器はスキャナ (scanner) とトークナイザ (tokenizer) から構成される。\n",
			//
			[
				'計算', '機科', '学', 'に', 'おける', '字句', '解析', 'じくかい', 'せき', '英',
				'Lexical', 'Analysis', 'と', 'は', 'ソースコード', 'を', '構成', 'する',
				'文字', 'の', '並び', 'を', 'トークン', 'token', 'の', '並び', 'に', '変換',
				'する', 'こと', 'をいう', 'ここ', 'でいう', 'トークン', 'と', 'は', '意味', 'を',
				'持つ', 'コード', 'の', '最小', '単位', 'の', 'こと', '字句', '解析', 'を',
				'行う', 'プログラム', 'は', '字句', '解析', '器', 'lexical', 'analyzer',
				'略称', 'lexer', 'と', '呼ば', 'れる', '字句', '解析', '器', 'は', 'スキャナ', 'scanner',
				'と', 'トークナイザ', 'tokenizer', 'から', '構成', 'さ', 'れる',
			]
		];

		return $provider;
	}

}
