-
Notifications
You must be signed in to change notification settings - Fork 7
/
test_multibyte.php
162 lines (106 loc) · 6.35 KB
/
test_multibyte.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
<?php
/**
* A unit test to verify that turning off the MultiByte library works.
*
* Kind of a sanity check to make sure that the inverse of all the MultiByte tests is also true.
*/
class MultiByteTest extends UnitTestCase {
// our test strings, in numeric entities to prevent editor or os butchering
private $test_strings = array(
'lowercase' => 'привет', // привет
'ucfirst' => 'Привет', // Привет
'uppercase' => 'ПРИВЕТ', // ПРИВЕТ
'international' => 'n2â7t Iñtërnâtiônàlizætiøn l13izæ42tiøn', // n2â7t Iñtërnâtiônàlizætiøn l13izæ42tiøn
'international_substr_1_3' => '2â7', // 2â7
'international_substr_5' => ' Iñtërnâtiônàlizætiøn l13izæ42tiøn', // note the leading space - Iñtërnâtiônàlizætiøn l13izæ42tiøn
'strpos' => 'и', // и
'strpos2' => 'â', // â
'lowercase_sentence' => 'коровы идут му', // коровы идут му
'ucwords_sentence' => 'Коровы Идут Му', // Коровы Идут Му
'jis' => 'ツ・', // ¥オキサ
);
// stores the library in use so we can restore it in tearDown()
private $old_library;
/**
* Setup: Decode our test strings aheads of time and disable the MultiByte library.
*/
protected function setup ( ) {
$convmap = array( 0x0080, 0xffff, 0, 0xffff );
foreach ( $this->test_strings as $key => $value ) {
$this->test_strings[ $key ] = mb_decode_numericentity( $value, $convmap, 'utf-8' );
}
}
/**
* Teardown: Restore the previous MutliByte library so later tests don't fail.
*/
protected function teardown ( ) {
// restore the multibyte library in use so other tests don't fail
MultiByte::library( $this->old_library );
}
public function test_hab_encoding ( ) {
// see what the current value is
$original = MultiByte::hab_encoding();
// make sure it equals the static value
$this->assert_equal( $original, MultiByte::$hab_enc );
// change it, saving the old
$old = MultiByte::hab_encoding( 'foo' );
// make sure the old value is equal to the original value - it should return the previous when we set it
$this->assert_equal( $old, $original );
// set the original value back
MultiByte::hab_encoding( $original );
// make sure that the original really did get set - really a duplicate of the prior assertion, but you know...
$this->assert_equal( $original, MultiByte::hab_encoding() );
}
public function test_substr ( ) {
// test that a substring with a starting and ending value works correctly
$this->assert_equal( MultiByte::substr( $this->test_strings['international'], 1, 3 ), $this->test_strings['international_substr_1_3'] );
// test that a substring with only a starting value works correctly
$this->assert_equal( MultiByte::substr( $this->test_strings['international'], 5 ), $this->test_strings['international_substr_5'] );
}
public function test_strlen ( ) {
$this->assert_equal( MultiByte::strlen( $this->test_strings['lowercase'] ), 6 ); // it's 12 bytes long, each character is 2-bytes wide
$this->assert_equal( MultiByte::strlen( 'abcd' ), 4 );
}
public function test_strtolower ( ) {
$this->assert_equal( MultiByte::strtolower( $this->test_strings['ucfirst'] ), $this->test_strings['lowercase'] );
}
public function test_strtoupper ( ) {
$this->assert_equal( MultiByte::strtoupper( $this->test_strings['lowercase'] ), $this->test_strings['uppercase'] );
}
public function test_ucfirst ( ) {
$this->assert_equal( MultiByte::ucfirst( $this->test_strings['lowercase'] ), $this->test_strings['ucfirst'] );
$this->assert_equal( MultiByte::ucfirst( 'abcd' ), 'Abcd' );
}
public function test_lcfirst ( ) {
// test the emultated native method (lcfirst is only in 5.3+)
$this->assert_equal( MultiByte::lcfirst( $this->test_strings['ucfirst'] ), $this->test_strings['lowercase'] );
$this->assert_equal( MultiByte::lcfirst( 'Abcd' ), 'abcd' );
}
public function test_strpos ( ) {
// there should probably be a better effort to come up with a meaningful test
// make sure a simple strpos works
$this->assert_equal( MultiByte::strpos( $this->test_strings['lowercase'], $this->test_strings['strpos'] ), 2 );
$this->assert_equal( MultiByte::strpos( $this->test_strings['international'], $this->test_strings['strpos2'] ), 2 ); // this one works because the characters before it are native!
// make sure a strpos with an offset works
$this->assert_equal( MultiByte::strpos( $this->test_strings['lowercase'], $this->test_strings['strpos'], 1 ), 2 );
$this->assert_equal( MultiByte::strpos( $this->test_strings['international'], $this->test_strings['strpos2'], 4 ), 12 );
// make sure a non-esistant strpos works - the character does not exist after the offset
$this->assert_equal( MultiByte::strpos( $this->test_strings['lowercase'], $this->test_strings['strpos'], 3 ), false );
$this->assert_equal( MultiByte::strpos( $this->test_strings['international'], $this->test_strings['strpos2'], 14 ), false );
// and perform a single test with an ascii string for code coverage - this one should still work fine!
$this->assert_equal( MultiByte::strpos( 'abcd', 'c', null, 'ascii' ), 2 );
}
public function test_strrpos ( ) {
$this->assert_equal( MultiByte::strrpos( $this->test_strings['lowercase'], $this->test_strings['strpos'] ), 2 );
$this->assert_equal( MultiByte::strrpos( $this->test_strings['international'], 'n' ), 38 ); // the string is 48 BYTES long, only 38 characters long
}
public function test_ucwords ( ) {
$this->assert_equal( MultiByte::ucwords( $this->test_strings['lowercase_sentence'] ), $this->test_strings['ucwords_sentence'] );
}
public function test_detect_encoding ( ) {
$this->assert_equal( MultiByte::detect_encoding( 'foo' ), 'ASCII' );
$this->assert_equal( MultiByte::detect_encoding( $this->test_strings['jis'] ), 'JIS' );
//echo MultiByte::detect_encoding( '' ); die();
}
}
?>