Home | History | Annotate | Download | only in mjsunit
      1 // Copyright 2014 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 var whitespaces = [
      6   // WhiteSpace defined in ECMA-262 5.1, 7.2
      7   0x0009,  // Tab                  TAB
      8   0x000B,  // Vertical Tab         VT
      9   0x000C,  // Form Feed            FF
     10   0x0020,  // Space                SP
     11   0x00A0,  // No-break space       NBSP
     12   0xFEFF,  // Byte Order Mark      BOM
     13 
     14   // LineTerminator defined in ECMA-262 5.1, 7.3
     15   0x000A,  // Line Feed            LF
     16   0x000D,  // Carriage Return      CR
     17   0x2028,  // Line Separator       LS
     18   0x2029,  // Paragraph Separator  PS
     19 
     20   // Unicode 6.3.0 whitespaces (category 'Zs')
     21   0x1680,  // Ogham Space Mark
     22   0x180E,  // Mongolian Vowel Separator
     23   0x2000,  // EN QUAD
     24   0x2001,  // EM QUAD
     25   0x2002,  // EN SPACE
     26   0x2003,  // EM SPACE
     27   0x2004,  // THREE-PER-EM SPACE
     28   0x2005,  // FOUR-PER-EM SPACE
     29   0x2006,  // SIX-PER-EM SPACE
     30   0x2007,  // FIGURE SPACE
     31   0x2008,  // PUNCTUATION SPACE
     32   0x2009,  // THIN SPACE
     33   0x200A,  // HAIR SPACE
     34   0x2028,  // LINE SEPARATOR
     35   0x2029,  // PARAGRAPH SEPARATOR
     36   0x202F,  // NARROW NO-BREAK SPACE
     37   0x205F,  // MEDIUM MATHEMATICAL SPACE
     38   0x3000,  // IDEOGRAPHIC SPACE
     39 ];
     40 
     41 // Add single twobyte char to force twobyte representation.
     42 // Interestingly, snowman is not "white" space :)
     43 var twobyte = "\u2603";
     44 var onebyte = "\u007E";
     45 var twobytespace = "\u2000";
     46 var onebytespace = "\u0020";
     47 
     48 function is_whitespace(c) {
     49   return whitespaces.indexOf(c.charCodeAt(0)) > -1;
     50 }
     51 
     52 function test_regexp(str) {
     53   var pos_match = str.match(/\s/);
     54   var neg_match = str.match(/\S/);
     55   var test_char = str[0];
     56   var postfix = str[1];
     57   if (is_whitespace(test_char)) {
     58     assertEquals(test_char, pos_match[0]);
     59     assertEquals(postfix, neg_match[0]);
     60   } else {
     61     assertEquals(test_char, neg_match[0]);
     62     assertNull(pos_match);
     63   }
     64 }
     65 
     66 function test_trim(c, infix) {
     67   var str = c + c + c + infix + c;
     68   if (is_whitespace(c)) {
     69     assertEquals(infix, str.trim());
     70   } else {
     71     assertEquals(str, str.trim());
     72   }
     73 }
     74 
     75 function test_parseInt(c, postfix) {
     76   // Skip if prefix is a digit.
     77   if (c >= "0" && c <= "9") return;
     78   var str = c + c + "123" + postfix;
     79   if (is_whitespace(c)) {
     80     assertEquals(123, parseInt(str));
     81   } else {
     82     assertEquals(NaN, parseInt(str));
     83   }
     84 }
     85 
     86 function test_eval(c, content) {
     87   if (!is_whitespace(c)) return;
     88   var str = c + c + "'" + content + "'" + c + c;
     89   assertEquals(content, eval(str));
     90 }
     91 
     92 function test_stringtonumber(c, postfix) {
     93   // Skip if prefix is a digit.
     94   if (c >= "0" && c <= "9") return;
     95   var result = 1 + Number(c + "123" + c + postfix);
     96   if (is_whitespace(c)) {
     97     assertEquals(124, result);
     98   } else {
     99     assertEquals(NaN, result);
    100   }
    101 }
    102 
    103 for (var i = 0; i < 0x10000; i++) {
    104   c = String.fromCharCode(i);
    105   test_regexp(c + onebyte);
    106   test_regexp(c + twobyte);
    107   test_trim(c, onebyte + "trim");
    108   test_trim(c, twobyte + "trim");
    109   test_parseInt(c, onebyte);
    110   test_parseInt(c, twobyte);
    111   test_eval(c, onebyte);
    112   test_eval(c, twobyte);
    113   test_stringtonumber(c, onebytespace);
    114   test_stringtonumber(c, twobytespace);
    115 }
    116