Home | History | Annotate | Download | only in glue
      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 
     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 
     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 
     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 
     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 
    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