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.

195 lines
224 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\Big5;
use MensBeam\Intl\Encoding\Encoding;
use MensBeam\Intl\Encoding\EncoderException;
class TestBig5 extends \MensBeam\Intl\Test\CoderDecoderTest {
protected $testedClass = Big5::class;
/*
Char 0 U+007A (1 byte) Offset 0
Char 1 U+86CC (2 bytes) Offset 1
Char 2 U+6C34 (2 bytes) Offset 3
Char 3 U+00CA (0 bytes) Offset 5
Char 4 U+0304 (2 bytes) Offset 5
Char 5 U+00EA (0 bytes) Offset 7
Char 6 U+030C (2 bytes) Offset 7
End of string at char 7, offset 9
*/
protected $seekString = "7A D7AA A4F4 8862 88A5";
protected $seekCodes = [0x7A, 0x86CC, 0x6C34, 0xCA, 0x304, 0xEA, 0x30C];
protected $seekOffsets = [0, 1, 3, 5, 5, 7, 7, 9];
/* This string contains an invalid character sequence sandwiched between two null characters */
protected $brokenChar = "00 FF 00";
/**
* @dataProvider provideCodePoints
* @covers MensBeam\Intl\Encoding\Big5::encode
* @covers MensBeam\Intl\Encoding\Big5::err
*/
public function testEncodeCodePoints(bool $fatal, $input, $exp) {
return parent::testEncodeCodePoints($fatal, $input, $exp);
}
/**
* @dataProvider provideStrings
* @covers MensBeam\Intl\Encoding\Big5::__construct
* @covers MensBeam\Intl\Encoding\Big5::nextCode
*/
public function testDecodeMultipleCharactersAsCodePoints(string $input, array $exp) {
return parent::testDecodeMultipleCharactersAsCodePoints($input, $exp);
}
/**
* @dataProvider provideStrings
* @covers MensBeam\Intl\Encoding\Big5::__construct
* @covers MensBeam\Intl\Encoding\Big5::nextChar
*/
public function testDecodeMultipleCharactersAsStrings(string $input, array $exp) {
return parent::testDecodeMultipleCharactersAsStrings($input, $exp);
}
/**
* @dataProvider provideStrings
* @covers MensBeam\Intl\Encoding\Big5::seekBack
*/
public function testSTepBackThroughAString(string $input, array $exp) {
return parent::testSTepBackThroughAString($input, $exp);
}
/**
* @covers MensBeam\Intl\Encoding\Big5::seek
* @covers MensBeam\Intl\Encoding\Big5::posChar
* @covers MensBeam\Intl\Encoding\Big5::posByte
* @covers MensBeam\Intl\Encoding\Big5::rewind
*/
public function testSeekThroughAString() {
return parent::testSeekThroughAString();
}
/**
* @covers MensBeam\Intl\Encoding\Big5::posChar
* @covers MensBeam\Intl\Encoding\Big5::posByte
4 years ago
* @covers MensBeam\Intl\Encoding\Big5::eof
*/
public function testTraversePastTheEndOfAString() {
return parent::testTraversePastTheEndOfAString();
}
/**
* @covers MensBeam\Intl\Encoding\Big5::peekChar
* @covers MensBeam\Intl\Encoding\Big5::stateSave
* @covers MensBeam\Intl\Encoding\Big5::stateApply
*/
public function testPeekAtCharacters() {
return parent::testPeekAtCharacters();
}
/**
* @covers MensBeam\Intl\Encoding\Big5::peekCode
* @covers MensBeam\Intl\Encoding\Big5::stateSave
* @covers MensBeam\Intl\Encoding\Big5::stateApply
*/
public function testPeekAtCodePoints() {
return parent::testPeekAtCodePoints();
}
/**
* @dataProvider provideStrings
4 years ago
* @covers MensBeam\Intl\Encoding\Big5::lenChar
* @covers MensBeam\Intl\Encoding\Big5::lenByte
* @covers MensBeam\Intl\Encoding\Big5::stateSave
* @covers MensBeam\Intl\Encoding\Big5::stateApply
*/
public function testGetStringLength(string $input, array $points) {
return parent::testGetStringLength($input, $points);
}
/**
* @covers MensBeam\Intl\Encoding\Big5::err
*/
public function testReplacementModes() {
return parent::testReplacementModes();
}
/**
* @dataProvider provideStrings
* @covers MensBeam\Intl\Encoding\Big5::rewind
* @covers MensBeam\Intl\Encoding\Big5::chars
* @covers MensBeam\Intl\Encoding\Big5::codes
*/
public function testIterateThroughAString(string $input, array $exp) {
return parent::testIterateThroughAString($input, $exp);
}
/**
* @dataProvider provideStrings
* @coversNothing
*/
public function testIterateThroughAStringAllowingSurrogates(string $input, array $strictExp, array $relaxedExp = null) {
return parent::testIterateThroughAStringAllowingSurrogates($input, $strictExp, $relaxedExp);
}
public function provideCodePoints() {
return [
'U+0064 (HTML)' => [false, 0x64, "64"],
'U+0064 (fatal)' => [true, 0x64, "64"],
'U+00CA (HTML)' => [false, 0xCA, bin2hex("&#202;")],
'U+00CA (fatal)' => [true, 0xCA, new EncoderException("", Encoding::E_UNAVAILABLE_CODE_POINT)],
'U+3007 (HTML)' => [false, 0x3007, "C6 E2"],
'U+3007 (fatal)' => [true, 0x3007, "C6 E2"],
'-1 (HTML)' => [false, -1, new EncoderException("", Encoding::E_INVALID_CODE_POINT)],
'-1 (fatal)' => [true, -1, new EncoderException("", Encoding::E_INVALID_CODE_POINT)],
'0x110000 (HTML)' => [false, 0x110000, new EncoderException("", Encoding::E_INVALID_CODE_POINT)],
'0x110000 (fatal)' => [true, 0x110000, new EncoderException("", Encoding::E_INVALID_CODE_POINT)],
];
}
public function provideStrings() {
return [
'empty string' => ["", []],
'sanity check' => ["40", [64]],
'two-byte character' => ["D7 D7", [36290]],
'EOF after first byte' => ["D7", [65533]],
'low byte after first byte' => ["D7 39", [65533, 57]],
'0x80 as first byte' => ["80 D7 00", [65533, 65533, 0]],
'0xFF as first byte' => ["FF D7 00", [65533, 65533, 0]],
'invalid high byte as first byte' => ["81 D7 00", [65533, 0]],
'0x7F after first byte' => ["D7 7F", [65533, 127]],
'0xFF after first byte' => ["D7 FF", [65533]],
'invalid high byte after first byte' => ["D7 81", [65533]],
'broken string' => ["00 FF 00", [0, 65533, 0]],
'double-characters low' => ["88 62 88 64", [202, 772, 202, 780]],
'double-characters high' => ["88 A3 88 A5", [234, 772, 234, 780]],
'mixed string' => ["7A D7 AA A4 F4 88 62 88 A5", [122, 34508, 27700, 202, 772, 234, 780]],
'mixed string 2' => ["62 D7 D7 D7 D7 62", [98, 36290, 36290, 98]],
];
}
/**
* @group optional
*/
public function testPedanticallyDecodeSingleCharactersAsCodePoint() {
$series = [
'standard characters' => [["A1B1","C6D8","A1C2","A258","A1D3","A150","A1D1","A1D2","C8FB","C8FC","C8FA","C8F6","C8F8","C8F7","C8FE","C8F9","C8F5","C8FD","C6D9","A3BE","A3BC","A3BD","A3BF","A1C5","A3BB","A344","A345","A346","A347","A348","A349","A34A","A34B","A34C","A34D","A34E","A34F","A350","A351","A352","A353","A354","A355","A356","A357","A358","A359","A35A","A35B","A35C","A35D","A35E","A35F","A360","A361","A362","A363","A364","A365","A366","A367","A368","A369","A36A","A36B","A36C","A36D","A36E","A36F","A370","A371","A372","A373","C7F9","C7F3","C7F4","C7F5","C7F6","C7F7","C7F8","C7FA","C7FB","C7FC","C7FD","C7FE","C840","C841","C842","C843","C844","C845","C846","C847","C848","C849","C84A","C84B","C84C","C84D","C84E","C84F","C850","C851","C852","C853","C854","C855","C856","C857","C858","C859","C85A","C85C","C85D","C85E","C85F","C860","C861","C862","C863","C864","C865","C866","C867","C868","C869","C86A","C86B","C86C","C86D","C86E","C86F","C870","C871","C872","C873","C874","C875","C85B","A156","A158","A1A5","A1A6","A1A7","A1A8","A14C","A14B","A145","A1AC","A1AB","A1B0","A3E1","A24A","A1C1","A24B","C8D2","C8D3","A2B9","A2BA","A2BB","A2BC","A2BD","A2BE","A2BF","A2C0","A2C1","A2C2","C6B5","C6B6","C6B7","C6B8","C6B9","C6BA","C6BB","C6BC","C6BD","C6BE","A1F6","A1F4","A1F7","A1F5","A1F8","A1F9","A1FB","A1FA","C877","C878","C876","A241","A1D4","A1DB","A1E8","A1E7","A1FD","A1FC","A1E4","A1E5","A1EC","A1ED","A1EF","A1EE","A1DC","A1DA","A1DD","A1D8","A1D9","A1F2","A1F3","A1E6","A1E9","A3C0","A3C1","A3C2","A3C3","A3C4","A3C5","A3C6","A3C7","A3C8","A3C9","A3CA","A3CB","A3CC","A3CD","A3CE","A3CF","A3D0","A3D1","A3D2","A3D3","A3D4","A3D5","A3D6","A3D7","A3D8","A3D9","A3DA","A3DB","A3DC","A3DD","A3DE","A3DF","A3E0","C6A1","C6A2","C6A3","C6A4","C6A5","C6A6","C6A7","C6A8","C6A9","C6AA","C6AB","C6AC","C6AD","C6AE","C6AF","C6B0","C6B1","C6B2","C6B3","C6B4","A277","A278","A27A","A27B","A27C","A27D","A275","A274","A273","A272","A271","F9F9","F9F8","F9E6","F9EF","F9DD","F9E8","F9F1","F9DF","F9EC","F9F5","F9E3","F9EE","F9F7","F9E5","F9E9","F9F2","F9E0","F9EB","F9F4","F9E2","F9E7","F9F0","F9DE","F9ED","F9F6","F9E4","F9EA","F9F3","F9E1","A27E","A2A1","A2A3","A2A2","A2AC","A2AD","A2AE","A15A","A262","A263","A264","A265","A266","A267","A268","A269","A270","A26F","A26E","A26D","A26C","A26B","A26A","A276","A279","A1BD","A1BC","A1B6","A1B5","A1BF","A1BE","A1BB","A1BA","A1B3","A1B7","A1B4","A2A8","A2A9","A2AB","A2AA","A1B9","A1B8","A1F0","A1F1","C6E6","C8D6","C8D7","C8D8","C8D9","C8DA","C8DB","C8DC","C8DD","C8DE","C8DF","C8E0","C8E1","C8E2","C8E3","C8E4","C8E5","C8E6","C8E7","C8E8","C8E9","C8EA","C8EB","C8EC","C8ED","C8EE","C8EF","C8F0","C8F1","C6CD","A140","A142","A143","A1B2","C6E0","C6E1","C6E2","A171","A172","A16D","A16E","A175","A176","A179","A17A","A169","A16A","A245","A165","A166","A1A9","A1AA","A2C3","A2C4","A2C5","A2C6","A2C7","A2C8","A2C9","A2CA","A2CB","C6E7","C6E8","C6E9","C6EA","C6EB","C6EC","C6ED","C6EE","C6EF","C6F0","C6F1","C6F2","C6F3","C6F4","C6F5","C6F6","C6F7","C6F8","C6F9","C6FA","C6FB","C6FC","C6FD","C6FE","C740","C741","C742","C743","C744","C745","C746","C747","C748","C749","C74A","C74B","C74C","C74D","C74E","C74F","C750","C751","C752","C753","C754","C755","C756","C757","C758","C759","C75A","C75B","C75C","C75D","C75E","C75F","C760","C761","C762","C763","C764","C765","C766","C767","C768","C769","C76A","C76B","C76C","C76D","C76E","C76F","C770","C771","C772","C773","C774","C775","C776","C777","C778","C779","C77A","C8D4","C8D5","C6DC","C6DD","C77B","C77C","C77D","C77E","C7A1","C7A2","C7A3","C7A4","C7A5","C7A6","C7A7","C7A8","C7A9","C7AA","C7AB","C7AC","C7AD","C7AE","C7AF","C7B0","C7B1","C7B2","C7B3","C7B4","C7B5","C7B6","C7B7","C7B8","C7B9","C7BA","C7BB","C7BC","C7BD","C7BE","C7BF","C7C0","C7C1","C7C2","C7C3","C7C4","C7C5","C7C6","C7C7","C7C8","C7C9","C7CA","C7CB","C7CC","C7CD","C7CE","C7CF","C7D0","C7D1","C7D2","C7D3","C7D4","C7D5","C7D6","C7D7","C7D8","C7D9","C7DA","C7DB","C7DC","C7DD","C7DE","C7DF","C7E0","C7E1","C7E2","C7E3","C7E4","C7E5","C7E6","C7E7","C7E8","C7E9","C7EA","C7EB","C7EC","C7ED","C7EE","C7EF","C7F0","C7
'extended characters' => [["8859","8857","885D","885B","8866","8861","885F","886A","8868","886F","886D","88A7","8873","8871","8877","8875","887B","8879","88A2","8856","8867","885A","886C","885C","886E","8870","885E","8874","8878","8858","8869","8872","8860","8876","887A","887C","887D","887E","88A1","886B","88A8","8863","88A4","8865","88A6","88A9","88AA","8840","8841","8842","8843","8844","8846","8849","884A","884D","884F","8850","8851","8852","8854","8855","9277","96DF","8CF4","89D5","93CD","9BDF","89DA","8F59","89DB","8F5D","89DC","96F7","8ADA","8BDC","97DB","9E53","9DAA","87BE","9BEA","8A6E","8BC8","89E8","89EA","8C4B","89ED","94DD","89EE","9EB4","8AD3","92DB","94DB","89F9","89FB","9EFC","89FC","89BF","89FE","89E6","9D46","9DEE","A07E","A068","98E9","8B68","8DFD","8BBE","9FD9","8AEB","9FD7","8B6A","9C5C","8BB1","8770","9DF3","A0D0","92E9","9AEC","8FAB","8E45","9C6F","8D5C","9EDE","89EF","96E9","9EBB","94DE","9EB8","97BA","95D6","9CBB","97DA","8F45","9158","9856","9B4D","935B","95C7","97E7","9359","91F5","97B8","92FA","9357","8BA6","97B0","9CA1","91F2","91F9","8FF1","9745","9853","9251","9DAD","9BC2","9A7B","8B60","934B","9ABD","91B7","8D4B","95B4","9EF0","8D64","9269","8D67","8D68","93EB","877A","9166","93DD","8D52","8BCC","8D6D","8D6E","96A8","8D6F","8D70","8CF3","9060","8D74","97C3","8AD0","9274","9BBE","9CC8","9CBA","8D78","9EB9","955A","91B4","8A48","8D7D","8A7D","8AC2","8DA1","8AD1","8B47","93A4","9EDA","8A51","8DA6","9EC5","A078","94B5","8A6B","8DAB","8DAD","93C1","906F","8DB0","87A2","947E","90FA","9479","8DB2","997B","8DB4","8DB7","91B3","8DBB","8DBA","8DBC","9044","874B","93E4","93E0","8DC3","9BB8","93E9","93F6","8DC5","8DCA","8DCC","93B5","9CF8","9252","A0E8","9CA5","8C56","8DD6","97C0","A0DE","97D2","8DDB","8CEA","8EAF","91B5","8DEB","97C6","90FC","96D6","97C5","8DEF","97D7","8DF0","96A6","8CDF","8DF3","9449","8DF5","9872","8E6B","8F50","9DCC","8C44","996E","94A1","8F63","A0DA","9253","9DB5","9879","876A","9D5D","8D63","9669","9F70","8AC7","89D7","9EDD","98BC","95B0","9464","936F","94B9","95EC","91EE","98C3","95F6","8FFD","98C5","9766","97DD","8CAA","92D2","9761","98CB","95F0","975D","91E3","877E","98CC","9469","98CD","98CE","95FC","94A3","9662","9463","8D47","98D0","98D1","9475","9472","98D6","8AF0","98D9","8D5A","98DB","98DD","98A8","8A6D","8AFB","8AAE","8C5D","98E4","98E6","98E8","8A4D","9257","95DF","A0AC","98EB","98EC","8CC3","98F4","87D9","8AB8","9EE7","94BC","9CC6","8D4A","9E7E","8D44","98FE","9940","94C9","87C6","94D3","9946","90C0","94D1","8D4E","9573","87CE","93C2","9948","994B","8E55","994E","8EFE","8D5F","8E59","94EC","94EF","8C60","8F74","9955","9544","8CCB","9956","9959","995B","8CC4","90B7","9743","95CD","97C9","87AA","8EB9","95C6","9967","8CE3","8AB9","8DFC","8A76","9D51","9973","8740","9D4F","997A","9564","99A1","99A5","99A7","8EED","99AD","946E","8F70","99B3","A053","8D5E","965C","8CE0","97FE","92BD","8D5D","97FD","87DB","8F64","9562","97CD","9E64","924C","8EC9","99BC","9DA5","8F54","8F7C","8D55","8EA2","8F7A","97AE","96C8","8CE4","99C3","90D6","9CBE","8F76","9470","8CEF","8EC7","8D54","A0F9","8FA9","8D51","99C7","8744","90D7","8743","8747","8758","9EDF","8D59","8742","99CE","8FBA","8FEB","99CF","8FC2","92C9","97DC","875D","87CC","8D45","95B3","9C79","95B2","8D4C","8FDB","9BE3","874C","874D","9E7A","8757","9BEE","99DE","8A52","99E1","8A67","8BB5","8AAC","99E9","97DE","95D1","99F5","9BA9","9EA4","9D49","95DB","89C5","99F8","9664","9055","96D4","87C4","87AE","977C","964D","97E1","9A48","9A49","90AA","9A50","9347","8ED8","90C9","9A55","90BC","9A58","8BB8","90D5","9641","9A5A","9A5C","97C2","875C","8ABB","9BAA","90F5","9A60","9145","8C58","9A63","8C49","8BB6","966B","9A6E","914F","9746","A0E6","92D7","9675","93D4","91BB","9679","9A70","9678","91CD","9C4A","A06F","A06A","915F","8741","9FA5","89BA","874F","874E","8755","9ECD","9A79","8CF2","8D57","9DCE","8CD2","8759","9D73","96B9","96BC","9CD1","89B7","9EEE","8749","875B","9EC9","91AE","8D58","8746","8D56","9D78","9D7B","9EB3","9EB2","9DD6","994F","89CE","8BC0","9FC4","8BD4","8C72","8BF9","8946","8BC6","9C57","9AFB","89D0","89CF","89
];
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");
}
}
}
}