dom/encoding/test/test_TextEncoder.js

branch
TOR_BUG_9701
changeset 15
b8a032363ba2
equal deleted inserted replaced
-1:000000000000 0:88acd858e7a1
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 }

mercurial