1<?php
2
3namespace Test\Parsoid\Language;
4
5use PHPUnit\Framework\TestCase;
6use Wikimedia\LangConv\ReplacementMachine;
7use Wikimedia\Parsoid\Language\LanguageConverter;
8use Wikimedia\Parsoid\Mocks\MockEnv;
9use Wikimedia\Parsoid\Utils\DOMCompat;
10
11class EnTest extends TestCase {
12
13	private const CODES = [ 'en', 'en-x-piglatin' ];
14
15	// phpcs:disable Generic.Files.LineLength.TooLong
16	private const TEST_CASES = [
17		[
18			'title' => 'Converting to Pig Latin',
19			'output' => [
20				'en' => "123 Pigpen pig latin of 123 don't stop believing in yourself queen JavaScript NASA",
21				'en-x-piglatin' => "123 Igpenpay igpay atinlay ofway 123 on'tday opstay elievingbay inway ourselfyay eenquay JavaScript NASA"
22			],
23			'input' => "123 Pigpen pig latin of 123 don't stop believing in yourself queen JavaScript NASA",
24			'code' => 'en'
25		],
26		[
27			'title' => 'Converting from Pig Latin',
28			'output' => [
29				'en' => "123 Pigpen pig latin of 123 don't tops believing in yourself queen avaScriptJay ASANAY",
30				'en-x-piglatin' => "123 Igpenpayway igpayway atinlayway ofwayway 123 on'tdayway opstayway elievingbayway inwayway ourselfyayway eenquayway avaScriptJay ASANAY"
31			],
32			'input' => "123 Igpenpay igpay atinlay ofway 123 on'tday opstay elievingbay inway ourselfyay eenquay avaScriptJay ASANAY",
33			// XXX: this is currently treated as just a guess, so it doesn't
34			// prevent pig latin from being double-encoded.
35			'code' => 'en-x-piglatin'
36		]
37	];
38
39	/** @var ReplacementMachine */
40	private static $machine;
41
42	public static function setUpBeforeClass(): void {
43		$lang = LanguageConverter::loadLanguage( new MockEnv( [] ), 'en' );
44		self::$machine = $lang->getConverter()->getMachine();
45	}
46
47	public static function tearDownAfterClass(): void {
48		self::$machine = null;
49	}
50
51	/**
52	 * @covers \Wikimedia\LangConv\FST
53	 * @dataProvider provideEn
54	 */
55	public function testEn( string $title, array $output, string $input, ?string $invertCode ) {
56		foreach ( self::CODES as $variantCode ) {
57			if ( !array_key_exists( $variantCode, $output ) ) {
58				continue;
59			}
60
61			$doc = DOMCompat::newDocument( true );
62			$out = self::$machine->convert(
63				$doc, $input, $variantCode,
64				$invertCode ?? $this->getInvertCode( $variantCode )
65			);
66			$expected = $output[$variantCode];
67			$this->assertEquals( $expected, $out->textContent );
68		}
69	}
70
71	public function provideEn() {
72		return array_map( static function ( $item ) {
73			return [
74				$item['title'],
75				$item['output'],
76				$item['input'],
77				$item['code'] ?? null
78			];
79		}, self::TEST_CASES );
80	}
81
82	private function getInvertCode( $variantCode ) {
83		return $variantCode === "en" ? "en-x-piglatin" : "en";
84	}
85}
86