1 // Copyright (c) 2006-2008 The Chromium 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 #include "testing/gtest/include/gtest/gtest.h"
6 #include "third_party/WebKit/Source/WebKit/chromium/public/WebRegularExpression.h"
7 #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
8 #include "third_party/WebKit/Source/WebKit/chromium/public/WebTextCaseSensitivity.h"
9
10 using namespace WebKit;
11
12 namespace {
13
14 class RegexTest : public testing::Test {
15 };
16
17 struct Match {
18 const WebUChar* text;
19 const int textLength;
20 const int matchPosition;
21 const int matchLength;
22 };
23
testMatches(const WebRegularExpression & regex,const Match * matches,const size_t nMatches)24 void testMatches(const WebRegularExpression& regex,
25 const Match* matches,
26 const size_t nMatches) {
27
28 for (size_t i = 0; i < nMatches; ++i) {
29 int matchedLength = matches[i].textLength;
30 EXPECT_EQ(matches[i].matchPosition, regex.match(
31 WebString(matches[i].text, matches[i].textLength), 0, &matchedLength));
32 if (matches[i].matchPosition != -1)
33 EXPECT_EQ(matches[i].matchLength, matchedLength);
34 }
35
36 }
37
38 } // namespace
39
40 #define MATCH_DESC(webuchar, matchPosition, matchLength) \
41 { webuchar, arraysize(webuchar), matchPosition, matchLength }
42
43
TEST(RegexTest,Basic)44 TEST(RegexTest, Basic) {
45 // Just make sure we're not completely broken.
46 WebRegularExpression regex("the quick brown fox", WebTextCaseSensitive);
47 EXPECT_EQ(0, regex.match("the quick brown fox"));
48 EXPECT_EQ(1, regex.match(" the quick brown fox"));
49 EXPECT_EQ(3, regex.match("foothe quick brown foxbar"));
50
51 EXPECT_EQ(-1, regex.match("The quick brown FOX"));
52 EXPECT_EQ(-1, regex.match("the quick brown fo"));
53 }
54
TEST(RegexTest,Unicode)55 TEST(RegexTest, Unicode) {
56 // Make sure we get the right offsets for unicode strings.
57 WebUChar pattern[] = {L'\x6240', L'\x6709', L'\x7f51', L'\x9875'};
58 WebRegularExpression regex(WebString(pattern, arraysize(pattern)),
59 WebTextCaseInsensitive);
60
61 WebUChar text1[] = {L'\x6240', L'\x6709', L'\x7f51', L'\x9875'};
62 WebUChar text2[] = {L' ', L'\x6240', L'\x6709', L'\x7f51', L'\x9875'};
63 WebUChar text3[] = {L'f', L'o', L'o', L'\x6240', L'\x6709', L'\x7f51', L'\x9875', L'b', L'a', L'r'};
64 WebUChar text4[] = {L'\x4e2d', L'\x6587', L'\x7f51', L'\x9875', L'\x6240', L'\x6709', L'\x7f51', L'\x9875'};
65
66 const Match matches[] = {
67 MATCH_DESC(text1, 0, 4),
68 MATCH_DESC(text2, 1, 4),
69 MATCH_DESC(text3, 3, 4),
70 MATCH_DESC(text4, 4, 4),
71 };
72
73 testMatches(regex, matches, arraysize(matches));
74 }
75
TEST(RegexTest,UnicodeMixedLength)76 TEST(RegexTest, UnicodeMixedLength) {
77 WebUChar pattern[] = {L':', L'[', L' ', L'\x2000', L']', L'+', L':'};
78 WebRegularExpression regex(WebString(pattern, arraysize(pattern)),
79 WebTextCaseInsensitive);
80
81 WebUChar text1[] = {L':', L' ', L' ', L':'};
82 WebUChar text2[] = {L' ', L' ', L':', L' ', L' ', L' ', L' ', L':', L' ', L' '};
83 WebUChar text3[] = {L' ', L':', L' ', L'\x2000', L' ', L':', L' '};
84 WebUChar text4[] = {L'\x6240', L'\x6709', L'\x7f51', L'\x9875', L' ', L':', L' ', L'\x2000', L' ', L'\x2000', L' ', L':', L' '};
85 WebUChar text5[] = {L' '};
86 WebUChar text6[] = {L':', L':'};
87
88 const Match matches[] = {
89 MATCH_DESC(text1, 0, 4),
90 MATCH_DESC(text2, 2, 6),
91 MATCH_DESC(text3, 1, 5),
92 MATCH_DESC(text4, 5, 7),
93 MATCH_DESC(text5, -1, -1),
94 MATCH_DESC(text6, -1, -1),
95 };
96
97 testMatches(regex, matches, arraysize(matches));
98 }
99
TEST(RegexTest,EmptyMatch)100 TEST(RegexTest, EmptyMatch) {
101 WebRegularExpression regex("|x", WebTextCaseInsensitive);
102 int matchedLength = 0;
103 EXPECT_EQ(0, regex.match("", 0, &matchedLength));
104 EXPECT_EQ(0, matchedLength);
105 }
106