Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 /*
2 * test_TextEncoder.js
3 * bug 764234 tests
4 */
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";
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];
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 }
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];
70 //Test null input string
71 testSingleString({encoding: "utf-8", input: data, expected: expectedString,
72 msg: "encoder with replacement character test."});
73 }
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";
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];
87 testSingleString({encoding: "Utf-16", input: data, expected: expected,
88 msg: "testing encoding from utf-16 to utf-16 zero."});
89 }
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."});
97 // passing spaces for encoding
98 testSingleString({encoding: " ", input: aData, error: "TypeError",
99 msg: "constructor encoding, spaces encoding test."});
101 // invalid encoding passed
102 testSingleString({encoding: "asdfasdf", input: aData, error: "TypeError",
103 msg: "constructor encoding, invalid encoding test."});
105 // null encoding passed
106 testSingleString({encoding: null, input: aData, error: "TypeError",
107 msg: "constructor encoding, \"null\" encoding test."});
109 // null encoding passed
110 testSingleString({encoding: "", input: aData, error: "TypeError",
111 msg: "constructor encoding, empty encoding test."});
112 }
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 }
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."});
127 //Test spaces as input string
128 testSingleString({encoding: "utf-8", input: " ", expected: [32, 32],
129 msg: "spaces as input string."});
130 }
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);
144 if (outText.length !== test.expected.length) {
145 assert_equals(outText.length, test.expected.length, test.msg + " length mismatch");
146 return;
147 }
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 }
158 function stringFromArray(a) {
159 return Array.map.call(a, function(v){return String.fromCharCode(v)}).join('');
160 }
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 ];
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],
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],
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]];
210 var expectedUTF16 = data.map(function(d) {
211 return new Uint8Array(new Uint16Array(arrayFromString(d)).buffer);
212 });
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."});
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 }
232 function arrayFromString(s) {
233 return s.split('').map(function(c){return String.charCodeAt(c)});
234 }
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);
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);
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 }
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 ];
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 }