1 // Copyright 2013 the V8 project authors. All rights reserved. 2 // Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 3 // 4 // Redistribution and use in source and binary forms, with or without 5 // modification, are permitted provided that the following conditions 6 // are met: 7 // 1. Redistributions of source code must retain the above copyright 8 // notice, this list of conditions and the following disclaimer. 9 // 2. Redistributions in binary form must reproduce the above copyright 10 // notice, this list of conditions and the following disclaimer in the 11 // documentation and/or other materials provided with the distribution. 12 // 13 // THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY 14 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 15 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 16 // DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY 17 // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 18 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 19 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 20 // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 22 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 24 description( 25 "This test checks Unicode in negative RegExp character classes." 26 ); 27 28 function test(pattern, str, expected_length) { 29 var result = eval('"' + str + '"').replace(new RegExp(pattern, 'img'), ''); 30 31 if (result.length == expected_length) 32 testPassed('"' + pattern + '", ' + '"' + str + '".'); 33 else 34 testFailed('"' + pattern + '", ' + '"' + str + '". Was "' + result + '".'); 35 } 36 37 38 test("\\s", " \\t\\f\\v\\r\\n", 0); // ASCII whitespace. 39 test("\\S", "", 0); // Cyrillic letters are non-whitespace... 40 test("\\s", "", 8); // ...and they aren't whitespace. 41 test("[\\s]", "", 8); 42 test("[\\S]", "", 0); 43 test("[^\\s]", "", 0); 44 test("[^\\S]", "", 8); 45 test("[\\s\\S]*", "\\u2002\\r\\n\\u00a0", 0); 46 test("\\S\\S", "", 0); 47 test("\\S{2}", "", 0); 48 49 test("\\w", "", 8); // Alas, only ASCII characters count as word ones in JS. 50 test("\\W", "", 0); 51 test("[\\w]", "", 8); 52 test("[\\W]", "", 0); 53 test("[^\\w]", "", 0); 54 test("[^\\W]", "", 8); 55 test("\\W\\W", "", 0); 56 test("\\W{2}", "", 0); 57 58 test("\\d", "", 8); // Digit and non-digit. 59 test("\\D", "", 0); 60 test("[\\d]", "", 8); 61 test("[\\D]", "", 0); 62 test("[^\\d]", "", 0); 63 test("[^\\D]", "", 8); 64 test("\\D\\D", "", 0); 65 test("\\D{2}", "", 0); 66 67 test("[\\S\\d]", "123", 0); 68 test("[\\d\\S]", "123", 0); 69 test("[^\\S\\d]", "123", 11); 70 test("[^\\d\\S]", "123", 11); 71 72 test("[ \\S]", " ", 0); 73 test("[\\S ]", " ", 0); 74 test("[ \\S]", " ", 0); 75 test("[\\S ]", " ", 0); 76 77 test("[^\\S]", " ", 8); 78 test("[^\\S]", " ", 8); 79 test("[^\\s]", " ", 4); 80 test("[^\\s]", " ", 4); 81 82 test("[ \\s\\S]", " \\r\\n", 0); 83 test("[\\S\\s ]", " \\r\\n", 0); 84 85 test("[^z]", " \\r\\n", 0); 86 test("[^]", " \\r\\n", 0); 87