Home | History | Annotate | Download | only in editing
      1 // Copyright 2014 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 "config.h"
      6 #include "core/editing/CompositionUnderlineRangeFilter.h"
      7 
      8 #include "core/editing/CompositionUnderline.h"
      9 #include "platform/graphics/Color.h"
     10 #include "wtf/Vector.h"
     11 #include "wtf/text/IntegerToStringConversion.h"
     12 #include "wtf/text/WTFString.h"
     13 #include <gtest/gtest.h>
     14 
     15 using namespace WebCore;
     16 
     17 namespace {
     18 
     19 // Parses test case string and populate |underlines|.
     20 void initUnderlines(const String& testCase, Vector<CompositionUnderline>* underlines)
     21 {
     22     ASSERT(underlines && underlines->size() == 0U);
     23     Vector<String> rangeList;
     24     testCase.split("|", rangeList);
     25     // Intervals are named 'A', 'B', ..., 'Z', so ensure there aren't too many.
     26     ASSERT_LE(rangeList.size(), static_cast<size_t>('Z' - 'A'));
     27     for (unsigned i = 0; i < rangeList.size(); ++i) {
     28         String range = rangeList[i];
     29         Vector<String> toks;
     30         rangeList[i].split(",", toks);
     31         ASSERT_EQ(2U, toks.size());
     32         int startOffset = toks[0].toInt();
     33         int endOffset = toks[1].toInt();
     34         ASSERT_LE(startOffset, endOffset);
     35         // For testing: Store i in red component of |color|, so the intervals
     36         // can be distinguished.
     37         underlines->append(CompositionUnderline(startOffset, endOffset, Color(i, 0, 0), false, 0));
     38     }
     39 }
     40 
     41 // Runs the filter and encodes the result into a string, with 'A' as first
     42 // elemnt, 'B' as second, etc.
     43 String filterUnderlines(const Vector<CompositionUnderline>& underlines, int indexLo, int indexHi)
     44 {
     45     CompositionUnderlineRangeFilter filter(underlines, indexLo, indexHi);
     46     String ret = "";
     47     for (CompositionUnderlineRangeFilter::ConstIterator it = filter.begin(); it != filter.end(); ++it) {
     48         int code = (*it).color.red();
     49         ret.append(static_cast<char>('A' + code));
     50     }
     51     return ret;
     52 }
     53 
     54 TEST(CompositionUnderlineRangeFilterTest, Empty)
     55 {
     56     Vector<CompositionUnderline> underlines;
     57     EXPECT_EQ("", filterUnderlines(underlines, 0, 10));
     58     EXPECT_EQ("", filterUnderlines(underlines, 5, 5));
     59 }
     60 
     61 TEST(CompositionUnderlineRangeFilterTest, Single)
     62 {
     63     String testCase = "10,20"; // Semi-closed interval: {10, 11, ..., 19}.
     64     Vector<CompositionUnderline> underlines;
     65     initUnderlines(testCase, &underlines);
     66     // The query intervals are all closed, e.g., [0, 9] = {0, ..., 9}.
     67     EXPECT_EQ("", filterUnderlines(underlines, 0, 9));
     68     EXPECT_EQ("A", filterUnderlines(underlines, 5, 10));
     69     EXPECT_EQ("A", filterUnderlines(underlines, 10, 20));
     70     EXPECT_EQ("A", filterUnderlines(underlines, 15, 25));
     71     EXPECT_EQ("A", filterUnderlines(underlines, 19, 30));
     72     EXPECT_EQ("", filterUnderlines(underlines, 20, 25));
     73     EXPECT_EQ("A", filterUnderlines(underlines, 5, 25));
     74 }
     75 
     76 TEST(CompositionUnderlineRangeFilterTest, Multi)
     77 {
     78     String testCase = "0,2|0,5|1,3|1,10|3,5|5,8|7,8|8,10";
     79     Vector<CompositionUnderline> underlines;
     80     initUnderlines(testCase, &underlines);
     81     EXPECT_EQ("", filterUnderlines(underlines, 11, 11));
     82     EXPECT_EQ("ABCDEFGH", filterUnderlines(underlines, 0, 9));
     83     EXPECT_EQ("BDEF", filterUnderlines(underlines, 4, 5));
     84     EXPECT_EQ("AB", filterUnderlines(underlines, 0, 0));
     85     EXPECT_EQ("BDE", filterUnderlines(underlines, 3, 3));
     86     EXPECT_EQ("DF", filterUnderlines(underlines, 5, 5));
     87     EXPECT_EQ("DFG", filterUnderlines(underlines, 7, 7));
     88 }
     89 
     90 } // namespace
     91