dom/encoding/test/test_TextEncoder.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

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 }

mercurial