xref: /webtrees/tests/app/Encodings/UTF16LETest.php (revision a26ec5ede3c2ecdb45b783755ede967935aaecba)
1<?php
2
3/**
4 * webtrees: online genealogy
5 * Copyright (C) 2023 webtrees development team
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 */
17
18declare(strict_types=1);
19
20namespace Fisharebest\Webtrees\Tests\Encodings;
21
22use Fisharebest\Webtrees\Encodings\UTF16LE;
23use Fisharebest\Webtrees\Encodings\UTF8;
24use PHPUnit\Framework\TestCase;
25
26use function chr;
27use function dechex;
28use function iconv;
29use function intdiv;
30use function range;
31
32/**
33 * Tests for class UTF16LE.
34 */
35class UTF16LETest extends TestCase
36{
37    /**
38     * @covers \Fisharebest\Webtrees\Encodings\AbstractEncoding
39     * @covers \Fisharebest\Webtrees\Encodings\UTF16LE
40     */
41    public function testToUtf8(): void
42    {
43        $encoding = new UTF16LE();
44
45        foreach (range(0, 0x7F) as $code) {
46            $char     = chr($code % 256) . chr(intdiv($code, 256));
47            $expected = iconv(UTF16LE::NAME, UTF8::NAME, $char);
48            $actual   = $encoding->toUtf8($char);
49
50            static::assertSame($expected, $actual, 'U+' . dechex($code));
51        }
52
53        foreach (range(0x80, 0xFF) as $code) {
54            $char     = chr($code % 256) . chr(intdiv($code, 256));
55            $actual = $encoding->toUtf8($char);
56
57            static::assertSame(UTF8::REPLACEMENT_CHARACTER, $actual, 'U+' . dechex($code));
58        }
59
60        foreach (range(0x100, 0xD7FF) as $code) {
61            $char     = chr($code % 256) . chr(intdiv($code, 256));
62            $expected = iconv(UTF16LE::NAME, UTF8::NAME, $char);
63            $actual   = $encoding->toUtf8($char);
64
65            static::assertSame($expected, $actual, 'U+' . dechex($code));
66        }
67
68        foreach (range(0xD800, 0xDFFF) as $code) {
69            $char     = chr($code % 256) . chr(intdiv($code, 256));
70            $actual = $encoding->toUtf8($char);
71
72            static::assertSame(UTF8::REPLACEMENT_CHARACTER, $actual, 'U+' . dechex($code));
73        }
74
75        foreach (range(0xE000, 0xFFFF) as $code) {
76            $char     = chr($code % 256) . chr(intdiv($code, 256));
77            $expected = iconv(UTF16LE::NAME, UTF8::NAME, $char);
78            $actual   = $encoding->toUtf8($char);
79
80            static::assertSame($expected, $actual, 'U+' . dechex($code));
81        }
82    }
83}
84