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