Translated using Weblate (Portuguese)
[phpmyadmin.git] / tests / unit / EncodingTest.php
blob1f5dfc78f3944418a3c2f464611b9be262b66c41
1 <?php
3 declare(strict_types=1);
5 namespace PhpMyAdmin\Tests;
7 use PhpMyAdmin\Config;
8 use PhpMyAdmin\Encoding;
9 use PHPUnit\Framework\Attributes\CoversClass;
10 use PHPUnit\Framework\Attributes\Group;
11 use PHPUnit\Framework\Attributes\Medium;
12 use PHPUnit\Framework\Attributes\RequiresPhpExtension;
14 use function _setlocale;
15 use function file_get_contents;
16 use function file_put_contents;
17 use function function_exists;
18 use function mb_convert_encoding;
19 use function mb_convert_kana;
20 use function setlocale;
21 use function unlink;
23 use const LC_ALL;
24 use const PHP_INT_SIZE;
26 #[CoversClass(Encoding::class)]
27 #[Medium]
28 class EncodingTest extends AbstractTestCase
30 protected function setUp(): void
32 parent::setUp();
34 Encoding::initEngine();
37 protected function tearDown(): void
39 parent::tearDown();
41 Encoding::initEngine();
44 /**
45 * Test for Encoding::convertString
47 public function testNoConversion(): void
49 self::assertSame(
50 'test',
51 Encoding::convertString('UTF-8', 'UTF-8', 'test'),
55 public function testInvalidConversion(): void
57 Encoding::setEngine(Encoding::ENGINE_NONE);
58 self::assertSame(
59 'test',
60 Encoding::convertString('UTF-8', 'anything', 'test'),
64 /**
65 * This group is used on debian packaging to exclude the test
67 * @see https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=854821#27
69 #[Group('extension-iconv')]
70 #[RequiresPhpExtension('iconv')]
71 public function testIconv(): void
73 // Set PHP native locale
74 if (function_exists('setlocale')) {
75 if (setlocale(0, 'POSIX') === false) {
76 self::markTestSkipped('native setlocale failed');
80 _setlocale(LC_ALL, 'POSIX');
82 $config = Config::getInstance();
83 if (PHP_INT_SIZE === 8) {
84 $config->set('IconvExtraParams', '//TRANSLIT');
85 Encoding::setEngine(Encoding::ENGINE_ICONV);
86 self::assertSame(
87 "This is the Euro symbol 'EUR'.",
88 Encoding::convertString(
89 'UTF-8',
90 'ISO-8859-1',
91 "This is the Euro symbol '€'.",
94 } elseif (PHP_INT_SIZE === 4) {
95 // NOTE: this does not work on 32bit systems and requires "//IGNORE"
96 // NOTE: or it will throw "iconv(): Detected an illegal character in input string"
97 $config->set('IconvExtraParams', '//TRANSLIT//IGNORE');
98 Encoding::setEngine(Encoding::ENGINE_ICONV);
99 self::assertSame(
100 "This is the Euro symbol ''.",
101 Encoding::convertString(
102 'UTF-8',
103 'ISO-8859-1',
104 "This is the Euro symbol '€'.",
110 public function testMbstring(): void
112 Encoding::setEngine(Encoding::ENGINE_MBSTRING);
113 self::assertSame(
114 "This is the Euro symbol '?'.",
115 Encoding::convertString(
116 'UTF-8',
117 'ISO-8859-1',
118 "This is the Euro symbol '€'.",
124 * Test for kanjiChangeOrder
126 public function testChangeOrder(): void
128 self::assertSame('ASCII,SJIS,EUC-JP,JIS', Encoding::getKanjiEncodings());
129 Encoding::kanjiChangeOrder();
130 self::assertSame('ASCII,EUC-JP,SJIS,JIS', Encoding::getKanjiEncodings());
131 Encoding::kanjiChangeOrder();
132 self::assertSame('ASCII,SJIS,EUC-JP,JIS', Encoding::getKanjiEncodings());
136 * Test for Encoding::kanjiStrConv
138 public function testKanjiStrConv(): void
140 self::assertSame(
141 'test',
142 Encoding::kanjiStrConv('test', '', ''),
145 self::assertSame(
146 'test è',
147 Encoding::kanjiStrConv('test è', '', ''),
150 self::assertSame(
151 mb_convert_encoding('test è', 'ASCII', 'SJIS'),
152 Encoding::kanjiStrConv('test è', 'ASCII', ''),
155 self::assertSame(
156 mb_convert_kana('全角', 'KV', 'SJIS'),
157 Encoding::kanjiStrConv('全角', '', 'kana'),
162 * Test for Encoding::kanjiFileConv
164 public function testFileConv(): void
166 $fileStr = '教育漢字常用漢字';
167 $filename = 'test.kanji';
168 self::assertNotFalse(file_put_contents($filename, $fileStr));
170 $result = Encoding::kanjiFileConv($filename, 'JIS', 'kana');
172 $string = file_get_contents($result);
173 Encoding::kanjiChangeOrder();
174 $expected = Encoding::kanjiStrConv($fileStr, 'JIS', 'kana');
175 Encoding::kanjiChangeOrder();
176 self::assertSame($string, $expected);
177 unlink($result);
181 * Test for Encoding::kanjiEncodingForm
183 public function testEncodingForm(): void
185 $actual = Encoding::kanjiEncodingForm();
186 self::assertStringContainsString('<input type="radio" name="knjenc"', $actual);
187 self::assertStringContainsString('type="radio" name="knjenc"', $actual);
188 self::assertStringContainsString('<input type="radio" name="knjenc" value="EUC-JP" id="kj-euc">', $actual);
189 self::assertStringContainsString('<input type="radio" name="knjenc" value="SJIS" id="kj-sjis">', $actual);
190 self::assertStringContainsString('<input type="checkbox" name="xkana" value="kana" id="kj-kana">', $actual);
193 public function testListEncodings(): void
195 Config::getInstance()->settings['AvailableCharsets'] = ['utf-8'];
196 $result = Encoding::listEncodings();
197 self::assertContains('utf-8', $result);
200 public function testListEncodingsForIso2022CnExt(): void
202 Encoding::setEngine(Encoding::ENGINE_ICONV);
203 Config::getInstance()->settings['AvailableCharsets'] = [
204 'utf-8',
205 'ISO-2022-CN',
206 'ISO2022CN',
207 'ISO-2022-CN-EXT',
208 'ISO2022CNEXT',
209 ' iso-2022-cn-ext ',
210 'ISO-2022-CN-EXT//TRANSLIT',
211 ' I S O - 2 0 2 2 - C N - E X T ',
212 ' I S O 2 0 2 2 C N E X T ',
213 'IS%O-20(22-CN-E$XT',
216 self::assertSame(['utf-8', 'ISO-2022-CN', 'ISO2022CN'], Encoding::listEncodings());