2 /* vim: set expandtab sw=4 ts=4 sts=4: */
4 * tests for Advisor class
6 * @package PhpMyAdmin-test
8 declare(strict_types
=1);
10 namespace PhpMyAdmin\Tests
;
12 use PhpMyAdmin\LanguageManager
;
13 use PhpMyAdmin\Tests\PmaTestCase
;
16 * Tests behaviour of PMA_Advisor class
18 * @package PhpMyAdmin-test
20 class LanguageTest
extends PmaTestCase
23 * @var LanguageManager
28 * Setup for Language tests.
32 protected function setUp(): void
34 $loc = LOCALE_PATH
. '/cs/LC_MESSAGES/phpmyadmin.mo';
35 if (! is_readable($loc)) {
36 $this->markTestSkipped('Missing compiled locales.');
38 $this->manager
= new LanguageManager();
44 protected function tearDown(): void
46 // Ensure we have English locale after tests
47 $this->manager
->getLanguage('en')->activate();
51 * Test language filtering
55 public function testAvailable()
57 $GLOBALS['PMA_Config']->set('FilterLanguages', 'cs|en$');
59 $langs = $this->manager
->availableLocales();
61 $this->assertCount(2, $langs);
62 $this->assertContains('cs', $langs);
63 $GLOBALS['PMA_Config']->set('FilterLanguages', '');
67 * Test no language filtering
71 public function testAllAvailable()
73 $GLOBALS['PMA_Config']->set('FilterLanguages', '');
75 $langs = $this->manager
->availableLocales();
77 $this->assertContains('cs', $langs);
78 $this->assertContains('en', $langs);
82 * Test whether listing locales works
86 public function testList()
88 $langs = $this->manager
->listLocaleDir();
89 $this->assertContains('cs', $langs);
90 $this->assertContains('en', $langs);
94 * Test for getting available languages
98 public function testLanguages()
100 $langs = $this->manager
->availableLanguages();
101 $this->assertGreaterThan(1, count($langs));
103 /* Ensure we have name for every language */
104 foreach ($langs as $lang) {
105 $this->assertNotEquals($lang->getCode(), strtolower($lang->getEnglishName()));
110 * Test for MySQL locales
114 public function testMySQLLocale()
116 $GLOBALS['PMA_Config']->set('FilterLanguages', '');
117 $czech = $this->manager
->getLanguage('cs');
118 $this->assertNotFalse($czech);
119 $this->assertEquals('cs_CZ', $czech->getMySQLLocale());
121 $azerbaijani = $this->manager
->getLanguage('az');
122 $this->assertNotFalse($azerbaijani);
123 $this->assertEquals('', $azerbaijani->getMySQLLocale());
127 * Test for getting available sorted languages
131 public function testSortedLanguages()
133 $langs = $this->manager
->sortedLanguages();
134 $this->assertGreaterThan(1, count($langs));
138 * Test getting language by code
142 public function testGet()
144 $GLOBALS['PMA_Config']->set('FilterLanguages', '');
145 $lang = $this->manager
->getLanguage('cs');
146 $this->assertNotEquals(false, $lang);
147 $this->assertEquals('Czech', $lang->getEnglishName());
148 $this->assertEquals('Čeština', $lang->getNativeName());
149 $lang = $this->manager
->getLanguage('nonexisting');
150 $this->assertEquals(false, $lang);
154 * Test language selection
156 * @param string $lang Value for forced language
157 * @param string $post Value for language in POST
158 * @param string $get Value for language in GET
159 * @param string $cookie Value for language in COOKIE
160 * @param string $accept Value for HTTP Accept-Language header
161 * @param string $agent Value for HTTP User-Agent header
162 * @param string $default Value for default language
163 * @param string $expect Expected language name
167 * @dataProvider selectDataProvider
169 public function testSelect($lang, $post, $get, $cookie, $accept, $agent, $default, $expect): void
171 $GLOBALS['PMA_Config']->set('FilterLanguages', '');
172 $GLOBALS['PMA_Config']->set('Lang', $lang);
173 $GLOBALS['PMA_Config']->set('is_https', false);
174 $_POST['lang'] = $post;
175 $_GET['lang'] = $get;
176 $_COOKIE['pma_lang'] = $cookie;
177 $_SERVER['HTTP_ACCEPT_LANGUAGE'] = $accept;
178 $_SERVER['HTTP_USER_AGENT'] = $agent;
179 $GLOBALS['PMA_Config']->set('DefaultLang', $default);
181 $lang = $this->manager
->selectLanguage();
183 $this->assertEquals($expect, $lang->getEnglishName());
185 $GLOBALS['PMA_Config']->set('Lang', '');
188 $_COOKIE['pma_lang'] = '';
189 $_SERVER['HTTP_ACCEPT_LANGUAGE'] = '';
190 $_SERVER['HTTP_USER_AGENT'] = '';
191 $GLOBALS['PMA_Config']->set('DefaultLang', 'en');
195 * Data provider for language selection test.
197 * @return array Test parameters.
199 public function selectDataProvider()
257 'cs,en-US;q=0.7,en;q=0.3',
268 'Mozilla/5.0 (Linux; U; Android 2.2.2; tr-tr; GM FOX)',
296 * Test for setting and parsing locales
298 * @param string $locale locale name
303 * @dataProvider listLocales
305 public function testGettext($locale): void
307 $GLOBALS['PMA_Config']->set('FilterLanguages', '');
308 /* We should be able to set the language */
309 $this->manager
->getLanguage($locale)->activate();
311 /* Grab some texts */
312 $this->assertStringContainsString('%s', _ngettext('%s table', '%s tables', 10));
313 $this->assertStringContainsString('%s', _ngettext('%s table', '%s tables', 1));
317 $this->manager
->getCurrentLanguage()->getCode()
322 * Data provider to generate list of available locales.
324 * @return array with arrays of available locales
326 public function listLocales()
329 foreach (LanguageManager
::getInstance()->availableLanguages() as $language) {
330 $ret[] = [$language->getCode()];