A set of dependency-free basic internationalization tools
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

244 lines
191 KiB

<?php
/** @license MIT
* Copyright 2018 J. King et al.
* See LICENSE and AUTHORS files for details */
declare(strict_types=1);
namespace MensBeam\Intl\TestCase\Encoding;
use MensBeam\Intl\Encoding\EUCJP;
use MensBeam\Intl\Encoding\Coder;
use MensBeam\Intl\Encoding\EncoderException;
class TestEUCJP extends \MensBeam\Intl\Test\CoderDecoderTest {
protected $testedClass = EUCJP::class;
/*
Char 0 U+007A (1 byte) Offset 0
Char 1 U+FF96 (2 bytes) Offset 1
Char 2 U+3088 (2 bytes) Offset 3
Char 3 U+FF0D (2 bytes) Offset 5
Char 4 U+005C (1 byte) Offset 7
Char 5 U+FF9B (2 bytes) Offset 8
Char 6 U+4F58 (3 bytes) Offset 10
End of string at char 7, offset 13
*/
protected $seekString = "7A 8ED6 A4E8 A1DD 5C 8EDB 8FB0EF";
protected $seekCodes = [0x7A, 0xFF96, 0x3088, 0xFF0D, 0x5C, 0xFF9B, 0x4F58];
protected $seekOffsets = [0, 1, 3, 5, 7, 8, 10, 13];
/* This string contains an invalid character sequence sandwiched between two null characters */
protected $brokenChar = "00 FF 00";
/* This string conatins the ASCII characters "A" and "Z" followed by two arbitrary non-ASCII characters, followed by the two ASCII characters "0" and "9" */
protected $spanString = "41 5A 8EDB 8FB0EF 30 39";
public function provideCodePoints() {
return [
'U+0064 (HTML)' => [false, 0x64, "64"],
'U+0064 (fatal)' => [true, 0x64, "64"],
'U+00A5 (HTML)' => [false, 0xA5, "5C"],
'U+00A5 (fatal)' => [true, 0xA5, "5C"],
'U+203E (HTML)' => [false, 0x203E, "7E"],
'U+203E (fatal)' => [true, 0x203E, "7E"],
'U+3088 (HTML)' => [false, 0x3088, "A4 E8"],
'U+3088 (fatal)' => [true, 0x3088, "A4 E8"],
'U+FF96 (HTML)' => [false, 0xFF96, "8E D6"],
'U+FF96 (fatal)' => [true, 0xFF96, "8E D6"],
'U+2212 (HTML)' => [false, 0x2212, "A1 DD"],
'U+2212 (fatal)' => [true, 0x2212, "A1 DD"],
'U+00E6 (HTML)' => [false, 0xE6, bin2hex("&#230;")],
'U+00E6 (fatal)' => [true, 0xE6, new EncoderException("", Coder::E_UNAVAILABLE_CODE_POINT)],
'U+FFE2 (HTML)' => [false, 0xFFE2, "A2 CC"],
'U+FFE2 (fatal)' => [true, 0xFFE2, "A2 CC"],
'U+2116 (HTML)' => [false, 0x2116, "AD E2"],
'U+2116 (fatal)' => [true, 0x2116, "AD E2"],
'-1 (HTML)' => [false, -1, new EncoderException("", Coder::E_INVALID_CODE_POINT)],
'-1 (fatal)' => [true, -1, new EncoderException("", Coder::E_INVALID_CODE_POINT)],
'0x110000 (HTML)' => [false, 0x110000, new EncoderException("", Coder::E_INVALID_CODE_POINT)],
'0x110000 (fatal)' => [true, 0x110000, new EncoderException("", Coder::E_INVALID_CODE_POINT)],
];
}
public function provideStrings() {
return [
'empty string' => ["", []],
'sanity check' => ["40", [64]],
'former ASCII deviations' => ["5C 7E", [92, 126]],
'changed multibyte index' => ["A1DD", [65293]],
'JIS X 0201 range' => ["8EA1 8EDF", [65377, 65439]],
'JIS X 0201 bogus range' => ["8EA0 8EE0", [65533, 65533]],
'JIS X 0201 truncated character 1' => ["8E", [65533]],
'JIS X 0201 truncated character 2' => ["8E 20", [65533, 32]],
'JIS X 0201 truncated character 3' => ["8E FF", [65533]],
'JIS X 0212 assigned range' => ["8FA2AF 8FEDE3", [728, 40869]],
'JIS X 0212 total range' => ["8FA1A1 8FFEFE", [65533, 65533]],
'JIS X 0212 bogus range 1' => ["8FA0A1 8FFFFE", [65533, 65533, 65533, 65533]],
'JIS X 0212 bogus range 2' => ["8FA1A0 8FFEFF", [65533, 65533]],
'JIS X 0212 truncated character 1' => ["8FA2", [65533]],
'JIS X 0212 truncated character 2' => ["8FA2 20", [65533, 32]],
'JIS X 0212 truncated character 3' => ["8FA2 FF", [65533]],
'JIS X 0208 assigned range' => ["A1A1 FCFE", [12288, 65282]],
'JIS X 0208 total range' => ["A1A1 FEFE", [12288, 65533]],
'JIS X 0208 bogus range' => ["A1A0 A0FE", [65533, 65533, 65533]],
'JIS X 0208 truncated character 1' => ["A1", [65533]],
'JIS X 0208 truncated character 2' => ["A1 20", [65533, 32]],
'JIS X 0208 truncated character 3' => ["A1 FF", [65533]],
];
}
/**
* @dataProvider provideCodePoints
* @covers MensBeam\Intl\Encoding\Encoder
* @covers MensBeam\Intl\Encoding\EUCJP::encode
4 years ago
* @covers MensBeam\Intl\Encoding\EUCJP::errEnc
4 years ago
*/
public function testEncodeCodePoints(bool $fatal, $input, $exp) {
return parent::testEncodeCodePoints($fatal, $input, $exp);
}
/**
* @dataProvider provideCodePoints
* @covers MensBeam\Intl\Encoding\EUCJP::encode
* @covers MensBeam\Intl\Encoding\EUCJP::errEnc
*/
public function testEncodeCodePointsStatically(bool $fatal, $input, $exp) {
return parent::testEncodeCodePointsStatically($fatal, $input, $exp);
}
/**
* @dataProvider provideStrings
* @covers MensBeam\Intl\Encoding\EUCJP::__construct
* @covers MensBeam\Intl\Encoding\EUCJP::nextCode
4 years ago
*/
public function testDecodeMultipleCharactersAsCodePoints(string $input, array $exp) {
return parent::testDecodeMultipleCharactersAsCodePoints($input, $exp);
}
/**
* @dataProvider provideStrings
* @covers MensBeam\Intl\Encoding\EUCJP::__construct
* @covers MensBeam\Intl\Encoding\EUCJP::nextChar
4 years ago
*/
public function testDecodeMultipleCharactersAsStrings(string $input, array $exp) {
return parent::testDecodeMultipleCharactersAsStrings($input, $exp);
}
/**
* @dataProvider provideStrings
* @covers MensBeam\Intl\Encoding\EUCJP::seekBack
4 years ago
*/
public function testSTepBackThroughAString(string $input, array $exp) {
return parent::testSTepBackThroughAString($input, $exp);
}
/**
* @covers MensBeam\Intl\Encoding\EUCJP::seek
* @covers MensBeam\Intl\Encoding\EUCJP::posChar
* @covers MensBeam\Intl\Encoding\EUCJP::posByte
* @covers MensBeam\Intl\Encoding\EUCJP::rewind
4 years ago
*/
public function testSeekThroughAString() {
return parent::testSeekThroughAString();
}
/**
* @covers MensBeam\Intl\Encoding\EUCJP::posChar
* @covers MensBeam\Intl\Encoding\EUCJP::posByte
4 years ago
*/
public function testTraversePastTheEndOfAString() {
return parent::testTraversePastTheEndOfAString();
}
/**
* @covers MensBeam\Intl\Encoding\EUCJP::peekChar
* @covers MensBeam\Intl\Encoding\EUCJP::stateSave
* @covers MensBeam\Intl\Encoding\EUCJP::stateApply
4 years ago
*/
public function testPeekAtCharacters() {
return parent::testPeekAtCharacters();
}
/**
* @covers MensBeam\Intl\Encoding\EUCJP::peekCode
* @covers MensBeam\Intl\Encoding\EUCJP::stateSave
* @covers MensBeam\Intl\Encoding\EUCJP::stateApply
4 years ago
*/
public function testPeekAtCodePoints() {
return parent::testPeekAtCodePoints();
}
/**
* @dataProvider provideStrings
4 years ago
* @covers MensBeam\Intl\Encoding\EUCJP::lenChar
* @covers MensBeam\Intl\Encoding\EUCJP::lenByte
* @covers MensBeam\Intl\Encoding\EUCJP::stateSave
* @covers MensBeam\Intl\Encoding\EUCJP::stateApply
4 years ago
*/
public function testGetStringLength(string $input, array $points) {
return parent::testGetStringLength($input, $points);
}
/**
4 years ago
* @covers MensBeam\Intl\Encoding\EUCJP::errDec
4 years ago
*/
public function testReplacementModes() {
return parent::testReplacementModes();
}
/**
* @dataProvider provideStrings
* @covers MensBeam\Intl\Encoding\EUCJP::rewind
* @covers MensBeam\Intl\Encoding\EUCJP::chars
* @covers MensBeam\Intl\Encoding\EUCJP::codes
4 years ago
*/
public function testIterateThroughAString(string $input, array $exp) {
return parent::testIterateThroughAString($input, $exp);
}
/**
* @dataProvider provideStrings
* @covers MensBeam\Intl\Encoding\EUCJP::nextCode
*/
public function testIterateThroughAStringAllowingSurrogates(string $input, array $strictExp, array $relaxedExp = null) {
return parent::testIterateThroughAStringAllowingSurrogates($input, $strictExp, $relaxedExp);
}
/**
* @covers MensBeam\Intl\Encoding\EUCJP::seekBack
*/
public function testSeekBackOverRandomData() {
return parent::testSeekBackOverRandomData();
}
/**
* @covers MensBeam\Intl\Encoding\EUCJP::asciiSpan
*/
public function testExtractAsciiSpans() {
parent::testExtractAsciiSpans();
}
/**
* @covers MensBeam\Intl\Encoding\EUCJP::asciiSpanNot
*/
public function testExtractNegativeAsciiSpans() {
parent::testExtractNegativeAsciiSpans();
}
/**
* @group optional
4 years ago
*/
public function testPedanticallyDecodeSingleCharactersAsCodePoint() {
$series = [
'characters' => [["5C","A1F8","A1AF","A1EB","A1DE","A1AD","A2F9","A1DF","A1E0","A6A1","A6A2","A6A3","A6A4","A6A5","A6A6","A6A7","A6A8","A6A9","A6AA","A6AB","A6AC","A6AD","A6AE","A6AF","A6B0","A6B1","A6B2","A6B3","A6B4","A6B5","A6B6","A6B7","A6B8","A6C1","A6C2","A6C3","A6C4","A6C5","A6C6","A6C7","A6C8","A6C9","A6CA","A6CB","A6CC","A6CD","A6CE","A6CF","A6D0","A6D1","A6D2","A6D3","A6D4","A6D5","A6D6","A6D7","A6D8","A7A7","A7A1","A7A2","A7A3","A7A4","A7A5","A7A6","A7A8","A7A9","A7AA","A7AB","A7AC","A7AD","A7AE","A7AF","A7B0","A7B1","A7B2","A7B3","A7B4","A7B5","A7B6","A7B7","A7B8","A7B9","A7BA","A7BB","A7BC","A7BD","A7BE","A7BF","A7C0","A7C1","A7D1","A7D2","A7D3","A7D4","A7D5","A7D6","A7D8","A7D9","A7DA","A7DB","A7DC","A7DD","A7DE","A7DF","A7E0","A7E1","A7E2","A7E3","A7E4","A7E5","A7E6","A7E7","A7E8","A7E9","A7EA","A7EB","A7EC","A7ED","A7EE","A7EF","A7F0","A7F1","A7D7","A1BE","A1BD","A1C6","A1C7","A1C8","A1C9","A2F7","A2F8","A1C5","A1C4","A2F3","A1EC","A1ED","A2A8","7E","A1EE","ADE2","ADE4","A2F2","ADB5","ADB6","ADB7","ADB8","ADB9","ADBA","ADBB","ADBC","ADBD","ADBE","FCF1","FCF2","FCF3","FCF4","FCF5","FCF6","FCF7","FCF8","FCF9","FCFA","A2AB","A2AC","A2AA","A2AD","A2CD","A2CE","A2CF","A2DF","A2D0","A2E0","A2BA","A2BB","ADF4","A1DD","A2E5","A2E7","A1E7","ADF8","A2DC","A1C2","A2CA","A2CB","A2C1","A2C0","A2E9","A2EA","ADF3","A1E8","A2E8","A2E6","A2E2","A1E2","A2E1","A1E5","A1E6","A2E3","A2E4","A2BE","A2BF","A2BC","A2BD","A2DD","ADF9","A2DE","ADA1","ADA2","ADA3","ADA4","ADA5","ADA6","ADA7","ADA8","ADA9","ADAA","ADAB","ADAC","ADAD","ADAE","ADAF","ADB0","ADB1","ADB2","ADB3","ADB4","A8A1","A8AC","A8A2","A8AD","A8A3","A8AE","A8A4","A8AF","A8A6","A8B1","A8A5","A8B0","A8A7","A8BC","A8B7","A8B2","A8A9","A8BE","A8B9","A8B4","A8A8","A8B8","A8BD","A8B3","A8AA","A8BA","A8BF","A8B5","A8AB","A8BB","A8C0","A8B6","A2A3","A2A2","A2A5","A2A4","A2A7","A2A6","A2A1","A1FE","A1FB","A1FD","A1FC","A2FE","A1FA","A1F9","A1EA","A1E9","A2F6","A2F5","A2F4","A1A1","A1A2","A1A3","A1B7","A1B9","A1BA","A1BB","A1D2","A1D3","A1D4","A1D5","A1D6","A1D7","A1D8","A1D9","A1DA","A1DB","A2A9","A2AE","A1CC","A1CD","ADE0","ADE1","A4A1","A4A2","A4A3","A4A4","A4A5","A4A6","A4A7","A4A8","A4A9","A4AA","A4AB","A4AC","A4AD","A4AE","A4AF","A4B0","A4B1","A4B2","A4B3","A4B4","A4B5","A4B6","A4B7","A4B8","A4B9","A4BA","A4BB","A4BC","A4BD","A4BE","A4BF","A4C0","A4C1","A4C2","A4C3","A4C4","A4C5","A4C6","A4C7","A4C8","A4C9","A4CA","A4CB","A4CC","A4CD","A4CE","A4CF","A4D0","A4D1","A4D2","A4D3","A4D4","A4D5","A4D6","A4D7","A4D8","A4D9","A4DA","A4DB","A4DC","A4DD","A4DE","A4DF","A4E0","A4E1","A4E2","A4E3","A4E4","A4E5","A4E6","A4E7","A4E8","A4E9","A4EA","A4EB","A4EC","A4ED","A4EE","A4EF","A4F0","A4F1","A4F2","A4F3","A1AB","A1AC","A1B5","A1B6","A5A1","A5A2","A5A3","A5A4","A5A5","A5A6","A5A7","A5A8","A5A9","A5AA","A5AB","A5AC","A5AD","A5AE","A5AF","A5B0","A5B1","A5B2","A5B3","A5B4","A5B5","A5B6","A5B7","A5B8","A5B9","A5BA","A5BB","A5BC","A5BD","A5BE","A5BF","A5C0","A5C1","A5C2","A5C3","A5C4","A5C5","A5C6","A5C7","A5C8","A5C9","A5CA","A5CB","A5CC","A5CD","A5CE","A5CF","A5D0","A5D1","A5D2","A5D3","A5D4","A5D5","A5D6","A5D7","A5D8","A5D9","A5DA","A5DB","A5DC","A5DD","A5DE","A5DF","A5E0","A5E1","A5E2","A5E3","A5E4","A5E5","A5E6","A5E7","A5E8","A5E9","A5EA","A5EB","A5EC","A5ED","A5EE","A5EF","A5F0","A5F1","A5F2","A5F3","A5F4","A5F5","A5F6","A1A6","A1BC","A1B3","A1B4","ADEA","ADEB","ADEC","ADE5","ADE6","ADE7","ADE8","ADE9","ADC6","ADCA","ADC1","ADC4","ADC2","ADCC","ADCB","ADC5","ADCD","ADC7","ADCF","ADC0","ADCE","ADC3","ADC8","ADC9","ADDF","ADEF","ADEE","ADED","ADD3","ADD4","ADD0","ADD1","ADD2","ADD6","ADD5","ADE3","B0EC","C3FA","BCB7","CBFC","BEE6","BBB0","BEE5","B2BC","C9D4","CDBF","D0A2","B1AF","B3EE","D0A3","C0A4","D2C2","B5D6","CABA","BEE7","CEBE","CAC2","F9AD","D0A4","C3E6","D0A5","B6FA","D0A6","B4DD","C3B0","BCE7","D0A7","D0A8","D0A9","C7B5","B5D7","C7B7","C6E3","B8C3","CBB3","E9C9","D0AA","BEE8","D0AB","B2B5","B6E5","B8F0","CCE9","D6A6","CDF0","C6FD","B4A5","B5B5","D0AC","D0AD","CEBB","CDBD","C1E8","D0AF","BBF6","C6F3","D0B2","B1BE","B8DF","B8DE","B0E6","CFCB","CFCA","BAB3","B
];
foreach ($series as $test) {
foreach ($test[0] as $a => $input) {
$class = $this->testedClass;
$char = hex2bin($input);
$exp = $test[1][$a];
$s = new $class($char);
$this->assertSame($exp, $s->nextCode(), "Sequence $input did not decode to $exp.");
$this->assertFalse($s->nextCode(), "Sequence $input did not end after one character");
}
}
}
}