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
24description(
25"This test checks Unicode in negative RegExp character classes."
26);
27
28function 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
38test("\\s", " \\t\\f\\v\\r\\n", 0); // ASCII whitespace.
39test("\\S", "Проверка", 0); // Cyrillic letters are non-whitespace...
40test("\\s", "Проверка", 8); // ...and they aren't whitespace.
41test("[\\s]", "Проверка", 8);
42test("[\\S]", "Проверка", 0);
43test("[^\\s]", "Проверка", 0);
44test("[^\\S]", "Проверка", 8);
45test("[\\s\\S]*", "\\u2002Проверка\\r\\n\\u00a0", 0);
46test("\\S\\S", "уф", 0);
47test("\\S{2}", "уф", 0);
48
49test("\\w", "Проверка", 8); // Alas, only ASCII characters count as word ones in JS.
50test("\\W", "Проверка", 0);
51test("[\\w]", "Проверка", 8);
52test("[\\W]", "Проверка", 0);
53test("[^\\w]", "Проверка", 0);
54test("[^\\W]", "Проверка", 8);
55test("\\W\\W", "уф", 0);
56test("\\W{2}", "уф", 0);
57
58test("\\d", "Проверка", 8); // Digit and non-digit.
59test("\\D", "Проверка", 0);
60test("[\\d]", "Проверка", 8);
61test("[\\D]", "Проверка", 0);
62test("[^\\d]", "Проверка", 0);
63test("[^\\D]", "Проверка", 8);
64test("\\D\\D", "уф", 0);
65test("\\D{2}", "уф", 0);
66
67test("[\\S\\d]", "Проверка123", 0);
68test("[\\d\\S]", "Проверка123", 0);
69test("[^\\S\\d]", "Проверка123", 11);
70test("[^\\d\\S]", "Проверка123", 11);
71
72test("[ \\S]", " Проверка ", 0);
73test("[\\S ]", " Проверка ", 0);
74test("[ф \\S]", " Проверка ", 0);
75test("[\\Sф ]", " Проверка ", 0);
76
77test("[^р\\S]", " Проверка ", 8);
78test("[^\\Sр]", " Проверка ", 8);
79test("[^р\\s]", " Проверка ", 4);
80test("[^\\sр]", " Проверка ", 4);
81
82test("[ф \\s\\S]", "Проверка \\r\\n", 0);
83test("[\\S\\sф ]", "Проверка \\r\\n", 0);
84
85test("[^z]", "Проверка \\r\\n", 0);
86test("[^ф]", "Проверка \\r\\n", 0);
87