|
1 /* |
|
2 * test_TextEncoder.js |
|
3 * bug 764234 tests |
|
4 */ |
|
5 |
|
6 function runTextEncoderTests() |
|
7 { |
|
8 var data = "\u00a0\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07\u0e08\u0e09" |
|
9 + "\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14" |
|
10 + "\u0e15\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c\u0e1d\u0e1e\u0e1f" |
|
11 + "\u0e20\u0e21\u0e22\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e29\u0e2a" |
|
12 + "\u0e2b\u0e2c\u0e2d\u0e2e\u0e2f\u0e30\u0e31\u0e32\u0e33\u0e34\u0e35" |
|
13 + "\u0e36\u0e37\u0e38\u0e39\u0e3a\u0e3f\u0e40\u0e41\u0e42\u0e43\u0e44" |
|
14 + "\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a\u0e4b\u0e4c\u0e4d\u0e4e\u0e4f" |
|
15 + "\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0e5a" |
|
16 + "\u0e5b"; |
|
17 |
|
18 var expectedString = [0xC2, 0xA0, 0xE0, 0xB8, 0x81, 0xE0, 0xB8, 0x82, 0xE0, |
|
19 0xB8, 0x83, 0xE0, 0xB8, 0x84, 0xE0, 0xB8, 0x85, 0xE0, |
|
20 0xB8, 0x86, 0xE0, 0xB8, 0x87, 0xE0, 0xB8, 0x88, 0xE0, |
|
21 0xB8, 0x89, 0xE0, 0xB8, 0x8A, 0xE0, 0xB8, 0x8B, 0xE0, |
|
22 0xB8, 0x8C, 0xE0, 0xB8, 0x8D, 0xE0, 0xB8, 0x8E, 0xE0, |
|
23 0xB8, 0x8F, 0xE0, 0xB8, 0x90, 0xE0, 0xB8, 0x91, 0xE0, |
|
24 0xB8, 0x92, 0xE0, 0xB8, 0x93, 0xE0, 0xB8, 0x94, 0xE0, |
|
25 0xB8, 0x95, 0xE0, 0xB8, 0x96, 0xE0, 0xB8, 0x97, 0xE0, |
|
26 0xB8, 0x98, 0xE0, 0xB8, 0x99, 0xE0, 0xB8, 0x9A, 0xE0, |
|
27 0xB8, 0x9B, 0xE0, 0xB8, 0x9C, 0xE0, 0xB8, 0x9D, 0xE0, |
|
28 0xB8, 0x9E, 0xE0, 0xB8, 0x9F, 0xE0, 0xB8, 0xA0, 0xE0, |
|
29 0xB8, 0xA1, 0xE0, 0xB8, 0xA2, 0xE0, 0xB8, 0xA3, 0xE0, |
|
30 0xB8, 0xA4, 0xE0, 0xB8, 0xA5, 0xE0, 0xB8, 0xA6, 0xE0, |
|
31 0xB8, 0xA7, 0xE0, 0xB8, 0xA8, 0xE0, 0xB8, 0xA9, 0xE0, |
|
32 0xB8, 0xAA, 0xE0, 0xB8, 0xAB, 0xE0, 0xB8, 0xAC, 0xE0, |
|
33 0xB8, 0xAD, 0xE0, 0xB8, 0xAE, 0xE0, 0xB8, 0xAF, 0xE0, |
|
34 0xB8, 0xB0, 0xE0, 0xB8, 0xB1, 0xE0, 0xB8, 0xB2, 0xE0, |
|
35 0xB8, 0xB3, 0xE0, 0xB8, 0xB4, 0xE0, 0xB8, 0xB5, 0xE0, |
|
36 0xB8, 0xB6, 0xE0, 0xB8, 0xB7, 0xE0, 0xB8, 0xB8, 0xE0, |
|
37 0xB8, 0xB9, 0xE0, 0xB8, 0xBA, 0xE0, 0xB8, 0xBF, 0xE0, |
|
38 0xB9, 0x80, 0xE0, 0xB9, 0x81, 0xE0, 0xB9, 0x82, 0xE0, |
|
39 0xB9, 0x83, 0xE0, 0xB9, 0x84, 0xE0, 0xB9, 0x85, 0xE0, |
|
40 0xB9, 0x86, 0xE0, 0xB9, 0x87, 0xE0, 0xB9, 0x88, 0xE0, |
|
41 0xB9, 0x89, 0xE0, 0xB9, 0x8A, 0xE0, 0xB9, 0x8B, 0xE0, |
|
42 0xB9, 0x8C, 0xE0, 0xB9, 0x8D, 0xE0, 0xB9, 0x8E, 0xE0, |
|
43 0xB9, 0x8F, 0xE0, 0xB9, 0x90, 0xE0, 0xB9, 0x91, 0xE0, |
|
44 0xB9, 0x92, 0xE0, 0xB9, 0x93, 0xE0, 0xB9, 0x94, 0xE0, |
|
45 0xB9, 0x95, 0xE0, 0xB9, 0x96, 0xE0, 0xB9, 0x97, 0xE0, |
|
46 0xB9, 0x98, 0xE0, 0xB9, 0x99, 0xE0, 0xB9, 0x9A, 0xE0, |
|
47 0xB9, 0x9B]; |
|
48 |
|
49 test(testEncoderGetEncoding, "testEncoderGetEncoding"); |
|
50 test(testInvalidSequence, "testInvalidSequence"); |
|
51 test(testEncodeUTF16ToUTF16, "testEncodeUTF16ToUTF16"); |
|
52 test(function() { |
|
53 testConstructorEncodingOption(data, expectedString) |
|
54 }, "testConstructorEncodingOption"); |
|
55 test(function() { |
|
56 testEncodingValues(data, expectedString) |
|
57 }, "testEncodingValues"); |
|
58 test(function() { |
|
59 testInputString(data, expectedString) |
|
60 }, "testInputString"); |
|
61 test(testStreamingOptions, "testStreamingOptions"); |
|
62 } |
|
63 |
|
64 function testInvalidSequence() |
|
65 { |
|
66 var data = "\u0e43\u0e44\ufffd\u0e45"; |
|
67 var expectedString = [0xE0, 0xB9, 0x83, 0xE0, 0xB9, 0x84, 0xEF, 0xBF, 0xBD, |
|
68 0xE0, 0xB9, 0x85]; |
|
69 |
|
70 //Test null input string |
|
71 testSingleString({encoding: "utf-8", input: data, expected: expectedString, |
|
72 msg: "encoder with replacement character test."}); |
|
73 } |
|
74 |
|
75 function testEncodeUTF16ToUTF16() |
|
76 { |
|
77 var data = "\u0e43\u0e44\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a\u0e4b\u0e4c" |
|
78 + "\u0e4d\u0e4e\u0e4f\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56" |
|
79 + "\u0e57\u0e58\u0e59\u0e5a\u0e5b"; |
|
80 |
|
81 var expected = [0x43, 0x0E, 0x44, 0x0E, 0x45, 0x0E, 0x46, 0x0E, 0x47, 0x0E, |
|
82 0x48, 0x0E, 0x49, 0x0E, 0x4A, 0x0E, 0x4B, 0x0E, 0x4C, 0x0E, |
|
83 0x4D, 0x0E, 0x4E, 0x0E, 0x4F, 0x0E, 0x50, 0x0E, 0x51, 0x0E, |
|
84 0x52, 0x0E, 0x53, 0x0E, 0x54, 0x0E, 0x55, 0x0E, 0x56, 0x0E, |
|
85 0x57, 0x0E, 0x58, 0x0E, 0x59, 0x0E, 0x5A, 0x0E, 0x5B, 0x0E]; |
|
86 |
|
87 testSingleString({encoding: "Utf-16", input: data, expected: expected, |
|
88 msg: "testing encoding from utf-16 to utf-16 zero."}); |
|
89 } |
|
90 |
|
91 function testConstructorEncodingOption(aData, aExpectedString) |
|
92 { |
|
93 // valid encoding passed |
|
94 testSingleString({encoding: "UTF-8", input: aData, expected: aExpectedString, |
|
95 msg: "testing encoding with valid utf-8 encoding."}); |
|
96 |
|
97 // passing spaces for encoding |
|
98 testSingleString({encoding: " ", input: aData, error: "TypeError", |
|
99 msg: "constructor encoding, spaces encoding test."}); |
|
100 |
|
101 // invalid encoding passed |
|
102 testSingleString({encoding: "asdfasdf", input: aData, error: "TypeError", |
|
103 msg: "constructor encoding, invalid encoding test."}); |
|
104 |
|
105 // null encoding passed |
|
106 testSingleString({encoding: null, input: aData, error: "TypeError", |
|
107 msg: "constructor encoding, \"null\" encoding test."}); |
|
108 |
|
109 // null encoding passed |
|
110 testSingleString({encoding: "", input: aData, error: "TypeError", |
|
111 msg: "constructor encoding, empty encoding test."}); |
|
112 } |
|
113 |
|
114 function testEncodingValues(aData, aExpectedString) |
|
115 { |
|
116 var encoding = "ISO-8859-11"; |
|
117 testSingleString({encoding: aData, input: encoding, error: "TypeError", |
|
118 msg: "encoder encoding values test."}); |
|
119 } |
|
120 |
|
121 function testInputString(aData, aExpectedString) |
|
122 { |
|
123 //Test null input string |
|
124 testSingleString({encoding: "utf-8", input: "", expected: [], |
|
125 msg: "encoder null input string test."}); |
|
126 |
|
127 //Test spaces as input string |
|
128 testSingleString({encoding: "utf-8", input: " ", expected: [32, 32], |
|
129 msg: "spaces as input string."}); |
|
130 } |
|
131 |
|
132 function testSingleString(test) |
|
133 { |
|
134 var outText; |
|
135 try { |
|
136 var stream = test.stream ? {stream: true} : null; |
|
137 outText = (new TextEncoder(test.encoding)).encode(test.input, stream); |
|
138 } catch (e) { |
|
139 assert_equals(e.name, test.error, test.msg); |
|
140 return; |
|
141 } |
|
142 assert_true(!test.error, test.msg); |
|
143 |
|
144 if (outText.length !== test.expected.length) { |
|
145 assert_equals(outText.length, test.expected.length, test.msg + " length mismatch"); |
|
146 return; |
|
147 } |
|
148 |
|
149 for (var i = 0; i < outText.length; i++) { |
|
150 if (outText[i] != test.expected[i]) { |
|
151 assert_equals(escape(stringFromArray(outText.buffer)), escape(stringFromArray(test.expected)), |
|
152 test.msg + " Bytes do not match expected bytes."); |
|
153 return; |
|
154 } |
|
155 } |
|
156 } |
|
157 |
|
158 function stringFromArray(a) { |
|
159 return Array.map.call(a, function(v){return String.fromCharCode(v)}).join(''); |
|
160 } |
|
161 |
|
162 function testStreamingOptions() |
|
163 { |
|
164 var data = [ |
|
165 "\u00a0\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07\u0e08\u0e09\u0e0a" |
|
166 + "\u0e0b\u0e0c\u0e0d\u0e0e\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14" |
|
167 + "\u0e15\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c\u0e1d", |
|
168 "\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28" |
|
169 + "\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e2f\u0e30\u0e31\u0e32" |
|
170 + "\u0e33\u0e34\u0e35\u0e36\u0e37\u0e38\u0e39\u0e3a\u0e3f\u0e40" |
|
171 + "\u0e41\u0e42", |
|
172 "\u0e43\u0e44\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a\u0e4b\u0e4c\u0e4d" |
|
173 + "\u0e4e\u0e4f\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57" |
|
174 + "\u0e58\u0e59\u0e5a\u0e5b" |
|
175 ]; |
|
176 |
|
177 var expected = [[0xC2, 0xA0, 0xE0, 0xB8, 0x81, 0xE0, 0xB8, 0x82, 0xE0, |
|
178 0xB8, 0x83, 0xE0, 0xB8, 0x84, 0xE0, 0xB8, 0x85, 0xE0, |
|
179 0xB8, 0x86, 0xE0, 0xB8, 0x87, 0xE0, 0xB8, 0x88, 0xE0, |
|
180 0xB8, 0x89, 0xE0, 0xB8, 0x8A, 0xE0, 0xB8, 0x8B, 0xE0, |
|
181 0xB8, 0x8C, 0xE0, 0xB8, 0x8D, 0xE0, 0xB8, 0x8E, 0xE0, |
|
182 0xB8, 0x8F, 0xE0, 0xB8, 0x90, 0xE0, 0xB8, 0x91, 0xE0, |
|
183 0xB8, 0x92, 0xE0, 0xB8, 0x93, 0xE0, 0xB8, 0x94, 0xE0, |
|
184 0xB8, 0x95, 0xE0, 0xB8, 0x96, 0xE0, 0xB8, 0x97, 0xE0, |
|
185 0xB8, 0x98, 0xE0, 0xB8, 0x99, 0xE0, 0xB8, 0x9A, 0xE0, |
|
186 0xB8, 0x9B, 0xE0, 0xB8, 0x9C, 0xE0, 0xB8, 0x9D], |
|
187 |
|
188 [0xE0, 0xB8, 0x9E, 0xE0, 0xB8, 0x9F, 0xE0, 0xB8, 0xA0, |
|
189 0xE0, 0xB8, 0xA1, 0xE0, 0xB8, 0xA2, 0xE0, 0xB8, 0xA3, |
|
190 0xE0, 0xB8, 0xA4, 0xE0, 0xB8, 0xA5, 0xE0, 0xB8, 0xA6, |
|
191 0xE0, 0xB8, 0xA7, 0xE0, 0xB8, 0xA8, 0xE0, 0xB8, 0xA9, |
|
192 0xE0, 0xB8, 0xAA, 0xE0, 0xB8, 0xAB, 0xE0, 0xB8, 0xAC, |
|
193 0xE0, 0xB8, 0xAD, 0xE0, 0xB8, 0xAE, 0xE0, 0xB8, 0xAF, |
|
194 0xE0, 0xB8, 0xB0, 0xE0, 0xB8, 0xB1, 0xE0, 0xB8, 0xB2, |
|
195 0xE0, 0xB8, 0xB3, 0xE0, 0xB8, 0xB4, 0xE0, 0xB8, 0xB5, |
|
196 0xE0, 0xB8, 0xB6, 0xE0, 0xB8, 0xB7, 0xE0, 0xB8, 0xB8, |
|
197 0xE0, 0xB8, 0xB9, 0xE0, 0xB8, 0xBA, 0xE0, 0xB8, 0xBF, |
|
198 0xE0, 0xB9, 0x80, 0xE0, 0xB9, 0x81, 0xE0, 0xB9, 0x82], |
|
199 |
|
200 [0xE0, 0xB9, 0x83, 0xE0, 0xB9, 0x84, 0xE0, 0xB9, 0x85, |
|
201 0xE0, 0xB9, 0x86, 0xE0, 0xB9, 0x87, 0xE0, 0xB9, 0x88, |
|
202 0xE0, 0xB9, 0x89, 0xE0, 0xB9, 0x8A, 0xE0, 0xB9, 0x8B, |
|
203 0xE0, 0xB9, 0x8C, 0xE0, 0xB9, 0x8D, 0xE0, 0xB9, 0x8E, |
|
204 0xE0, 0xB9, 0x8F, 0xE0, 0xB9, 0x90, 0xE0, 0xB9, 0x91, |
|
205 0xE0, 0xB9, 0x92, 0xE0, 0xB9, 0x93, 0xE0, 0xB9, 0x94, |
|
206 0xE0, 0xB9, 0x95, 0xE0, 0xB9, 0x96, 0xE0, 0xB9, 0x97, |
|
207 0xE0, 0xB9, 0x98, 0xE0, 0xB9, 0x99, 0xE0, 0xB9, 0x9A, |
|
208 0xE0, 0xB9, 0x9B]]; |
|
209 |
|
210 var expectedUTF16 = data.map(function(d) { |
|
211 return new Uint8Array(new Uint16Array(arrayFromString(d)).buffer); |
|
212 }); |
|
213 |
|
214 // STREAMING TEST ONE: test streaming three valid strings with stream option |
|
215 // set to true for all three. |
|
216 testArrayOfStrings({encoding: "utf-8", array: [ |
|
217 {input: data[0], stream: true, expected: expected[0]}, |
|
218 {input: data[1], stream: true, expected: expected[1]}, |
|
219 {input: data[2], stream: true, expected: expected[2]}, |
|
220 ], msg: "streaming test one."}); |
|
221 |
|
222 // STREAMING TEST TWO: test streaming valid strings with stream option |
|
223 // streaming option: false from constructor, string 1 stream: true, |
|
224 // string 2 stream: false, string 3 stream: false |
|
225 testArrayOfStrings({encoding: "utf-16", array: [ |
|
226 {input: data[0], stream: true, expected: expectedUTF16[0]}, |
|
227 {input: data[1], expected: expectedUTF16[1]}, |
|
228 {input: data[2], expected: expectedUTF16[2]}, |
|
229 ], msg: "streaming test two."}); |
|
230 } |
|
231 |
|
232 function arrayFromString(s) { |
|
233 return s.split('').map(function(c){return String.charCodeAt(c)}); |
|
234 } |
|
235 |
|
236 function testArrayOfStrings(test) |
|
237 { |
|
238 var encoder; |
|
239 try { |
|
240 encoder = new TextEncoder(test.encoding); |
|
241 } catch (e) { |
|
242 assert_equals(e.name, test.error, test.msg); |
|
243 return; |
|
244 } |
|
245 assert_true(!test.error, test.msg); |
|
246 |
|
247 var array = test.array; |
|
248 for (var i = 0; i < array.length; i += 1) { |
|
249 var stream = array[i].stream ? {stream: true} : null; |
|
250 var view = encoder.encode(array[i].input, stream); |
|
251 |
|
252 var stringLen = view.length; |
|
253 var expected = array[i].expected; |
|
254 for (var j = 0; j < stringLen; j++) { |
|
255 if (view[j] !== expected[j]) { |
|
256 assert_equals(view[j], expected[j], msg + " Bytes do not match expected bytes."); |
|
257 return; |
|
258 } |
|
259 } |
|
260 } |
|
261 } |
|
262 |
|
263 function testEncoderGetEncoding() |
|
264 { |
|
265 var labelEncodings = [ |
|
266 {encoding: "utf-8", labels: ["unicode-1-1-utf-8", "utf-8", "utf8"]}, |
|
267 {encoding: "utf-16le", labels: ["utf-16", "utf-16"]}, |
|
268 {encoding: "utf-16be", labels: ["utf-16be"]}, |
|
269 ]; |
|
270 |
|
271 for (var le of labelEncodings) { |
|
272 for (var label of le.labels) { |
|
273 var encoder = new TextEncoder(label); |
|
274 assert_equals(encoder.encoding, le.encoding, label + " label encoding test."); |
|
275 } |
|
276 } |
|
277 } |