136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Copyright 2013 the V8 project authors. All rights reserved.
236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Redistribution and use in source and binary forms, with or without
536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// modification, are permitted provided that the following conditions
636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// are met:
736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 1.  Redistributions of source code must retain the above copyright
836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//     notice, this list of conditions and the following disclaimer.
936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 2.  Redistributions in binary form must reproduce the above copyright
1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//     notice, this list of conditions and the following disclaimer in the
1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//     documentation and/or other materials provided with the distribution.
1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesdescription(
2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines"This test checks Unicode in negative RegExp character classes."
2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines);
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesfunction test(pattern, str, expected_length) {
2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  var result = eval('"' + str + '"').replace(new RegExp(pattern, 'img'), '');
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (result.length == expected_length)
3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    testPassed('"' + pattern + '", ' + '"' + str + '".');
3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  else
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    testFailed('"' + pattern + '", ' + '"' + str + '". Was "' + result + '".');
3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestest("\\s", " \\t\\f\\v\\r\\n", 0); // ASCII whitespace.
3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestest("\\S", "Проверка", 0); // Cyrillic letters are non-whitespace...
4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestest("\\s", "Проверка", 8); // ...and they aren't whitespace.
4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestest("[\\s]", "Проверка", 8);
4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestest("[\\S]", "Проверка", 0);
4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestest("[^\\s]", "Проверка", 0);
4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestest("[^\\S]", "Проверка", 8);
4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestest("[\\s\\S]*", "\\u2002Проверка\\r\\n\\u00a0", 0);
4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestest("\\S\\S", "уф", 0);
4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestest("\\S{2}", "уф", 0);
4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestest("\\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