phpmyadmin/tests/classes/EncodingTest.php
Maurício Meneghini Fauth ba72f543fd
Call PHPUnit static methods using static calls
Replaces $this->method() with self::method().

Signed-off-by: Maurício Meneghini Fauth <mauricio@fauth.dev>
2024-01-31 17:17:38 -03:00

203 lines
5.9 KiB
PHP

<?php
declare(strict_types=1);
namespace PhpMyAdmin\Tests;
use PhpMyAdmin\Config;
use PhpMyAdmin\Encoding;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\Group;
use PHPUnit\Framework\Attributes\RequiresPhpExtension;
use function _setlocale;
use function file_get_contents;
use function file_put_contents;
use function function_exists;
use function mb_convert_encoding;
use function mb_convert_kana;
use function setlocale;
use function unlink;
use const LC_ALL;
use const PHP_INT_SIZE;
#[CoversClass(Encoding::class)]
class EncodingTest extends AbstractTestCase
{
protected function setUp(): void
{
parent::setUp();
Encoding::initEngine();
}
protected function tearDown(): void
{
parent::tearDown();
Encoding::initEngine();
}
/**
* Test for Encoding::convertString
*/
#[Group('medium')]
public function testNoConversion(): void
{
self::assertEquals(
'test',
Encoding::convertString('UTF-8', 'UTF-8', 'test'),
);
}
public function testInvalidConversion(): void
{
// Invalid value to use default case
Encoding::setEngine(-1);
self::assertEquals(
'test',
Encoding::convertString('UTF-8', 'anything', 'test'),
);
}
/**
* This group is used on debian packaging to exclude the test
*
* @see https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=854821#27
*/
#[Group('extension-iconv')]
#[RequiresPhpExtension('iconv')]
public function testIconv(): void
{
// Set PHP native locale
if (function_exists('setlocale')) {
if (setlocale(0, 'POSIX') === false) {
self::markTestSkipped('native setlocale failed');
}
}
_setlocale(LC_ALL, 'POSIX');
$config = Config::getInstance();
if (PHP_INT_SIZE === 8) {
$config->settings['IconvExtraParams'] = '//TRANSLIT';
Encoding::setEngine(Encoding::ENGINE_ICONV);
self::assertEquals(
"This is the Euro symbol 'EUR'.",
Encoding::convertString(
'UTF-8',
'ISO-8859-1',
"This is the Euro symbol '€'.",
),
);
} elseif (PHP_INT_SIZE === 4) {
// NOTE: this does not work on 32bit systems and requires "//IGNORE"
// NOTE: or it will throw "iconv(): Detected an illegal character in input string"
$config->settings['IconvExtraParams'] = '//TRANSLIT//IGNORE';
Encoding::setEngine(Encoding::ENGINE_ICONV);
self::assertEquals(
"This is the Euro symbol ''.",
Encoding::convertString(
'UTF-8',
'ISO-8859-1',
"This is the Euro symbol '€'.",
),
);
}
}
public function testMbstring(): void
{
Encoding::setEngine(Encoding::ENGINE_MB);
self::assertEquals(
"This is the Euro symbol '?'.",
Encoding::convertString(
'UTF-8',
'ISO-8859-1',
"This is the Euro symbol '€'.",
),
);
}
/**
* Test for kanjiChangeOrder
*/
public function testChangeOrder(): void
{
self::assertEquals('ASCII,SJIS,EUC-JP,JIS', Encoding::getKanjiEncodings());
Encoding::kanjiChangeOrder();
self::assertEquals('ASCII,EUC-JP,SJIS,JIS', Encoding::getKanjiEncodings());
Encoding::kanjiChangeOrder();
self::assertEquals('ASCII,SJIS,EUC-JP,JIS', Encoding::getKanjiEncodings());
}
/**
* Test for Encoding::kanjiStrConv
*/
public function testKanjiStrConv(): void
{
self::assertEquals(
'test',
Encoding::kanjiStrConv('test', '', ''),
);
$GLOBALS['kanji_encoding_list'] = 'ASCII,SJIS,EUC-JP,JIS';
self::assertEquals(
'test è',
Encoding::kanjiStrConv('test è', '', ''),
);
self::assertEquals(
mb_convert_encoding('test è', 'ASCII', 'SJIS'),
Encoding::kanjiStrConv('test è', 'ASCII', ''),
);
self::assertEquals(
mb_convert_kana('全角', 'KV', 'SJIS'),
Encoding::kanjiStrConv('全角', '', 'kana'),
);
}
/**
* Test for Encoding::kanjiFileConv
*/
public function testFileConv(): void
{
$fileStr = '教育漢字常用漢字';
$filename = 'test.kanji';
self::assertNotFalse(file_put_contents($filename, $fileStr));
$GLOBALS['kanji_encoding_list'] = 'ASCII,EUC-JP,SJIS,JIS';
$result = Encoding::kanjiFileConv($filename, 'JIS', 'kana');
$string = file_get_contents($result);
Encoding::kanjiChangeOrder();
$expected = Encoding::kanjiStrConv($fileStr, 'JIS', 'kana');
Encoding::kanjiChangeOrder();
self::assertEquals($string, $expected);
unlink($result);
}
/**
* Test for Encoding::kanjiEncodingForm
*/
public function testEncodingForm(): void
{
$actual = Encoding::kanjiEncodingForm();
self::assertStringContainsString('<input type="radio" name="knjenc"', $actual);
self::assertStringContainsString('type="radio" name="knjenc"', $actual);
self::assertStringContainsString('<input type="radio" name="knjenc" value="EUC-JP" id="kj-euc">', $actual);
self::assertStringContainsString('<input type="radio" name="knjenc" value="SJIS" id="kj-sjis">', $actual);
self::assertStringContainsString('<input type="checkbox" name="xkana" value="kana" id="kj-kana">', $actual);
}
public function testListEncodings(): void
{
Config::getInstance()->settings['AvailableCharsets'] = ['utf-8'];
$result = Encoding::listEncodings();
self::assertContains('utf-8', $result);
}
}