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