12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/break_list.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkColor.h"
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/range/range.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gfx {
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BreakListTest : public testing::Test {};
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(BreakListTest, SetValue) {
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check the default values applied to new instances.
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BreakList<bool> style_breaks(false);
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(style_breaks.EqualsValueForTesting(false));
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  style_breaks.SetValue(true);
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(style_breaks.EqualsValueForTesting(true));
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Ensure that setting values works correctly.
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BreakList<SkColor> color_breaks(SK_ColorRED);
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(color_breaks.EqualsValueForTesting(SK_ColorRED));
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  color_breaks.SetValue(SK_ColorBLACK);
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(color_breaks.EqualsValueForTesting(SK_ColorBLACK));
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(BreakListTest, ApplyValue) {
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BreakList<bool> breaks(false);
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const size_t max = 99;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  breaks.SetMax(max);
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Ensure ApplyValue is a no-op on invalid and empty ranges.
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(true, Range::InvalidRange());
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(breaks.EqualsValueForTesting(false));
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < 3; ++i) {
38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    breaks.ApplyValue(true, Range(i, i));
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(breaks.EqualsValueForTesting(false));
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Apply a value to a valid range, check breaks; repeating should be no-op.
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::pair<size_t, bool> > expected;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected.push_back(std::pair<size_t, bool>(0, false));
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected.push_back(std::pair<size_t, bool>(2, true));
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected.push_back(std::pair<size_t, bool>(3, false));
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < 2; ++i) {
48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    breaks.ApplyValue(true, Range(2, 3));
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(breaks.EqualsForTesting(expected));
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Ensure setting a value overrides the ranged value.
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  breaks.SetValue(true);
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(breaks.EqualsValueForTesting(true));
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Ensure applying a value over [0, |max|) is the same as setting a value.
57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(false, Range(0, max));
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(breaks.EqualsValueForTesting(false));
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Ensure applying a value that is already applied has no effect.
61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(false, Range(0, 2));
62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(false, Range(3, 6));
63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(false, Range(7, max));
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(breaks.EqualsValueForTesting(false));
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Ensure applying an identical neighboring value merges the ranges.
67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(true, Range(0, 3));
68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(true, Range(3, 6));
69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(true, Range(6, max));
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(breaks.EqualsValueForTesting(true));
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Ensure applying a value with the same range overrides the ranged value.
73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(false, Range(2, 3));
74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(true, Range(2, 3));
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(breaks.EqualsValueForTesting(true));
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Ensure applying a value with a containing range overrides contained values.
78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(false, Range(0, 1));
79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(false, Range(2, 3));
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(true, Range(0, 3));
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(breaks.EqualsValueForTesting(true));
82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(false, Range(4, 5));
83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(false, Range(6, 7));
84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(false, Range(8, 9));
85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(true, Range(4, 9));
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(breaks.EqualsValueForTesting(true));
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Ensure applying various overlapping values yields the intended results.
89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(false, Range(1, 4));
90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(false, Range(5, 8));
91d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(true, Range(0, 2));
92d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(true, Range(3, 6));
93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(true, Range(7, max));
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::pair<size_t, bool> > overlap;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overlap.push_back(std::pair<size_t, bool>(0, true));
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overlap.push_back(std::pair<size_t, bool>(2, false));
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overlap.push_back(std::pair<size_t, bool>(3, true));
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overlap.push_back(std::pair<size_t, bool>(6, false));
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overlap.push_back(std::pair<size_t, bool>(7, true));
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(breaks.EqualsForTesting(overlap));
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(BreakListTest, SetMax) {
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Ensure values adjust to accommodate max position changes.
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BreakList<bool> breaks(false);
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  breaks.SetMax(9);
107d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(true, Range(0, 2));
108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(true, Range(3, 6));
109d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(true, Range(7, 9));
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::pair<size_t, bool> > expected;
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected.push_back(std::pair<size_t, bool>(0, true));
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected.push_back(std::pair<size_t, bool>(2, false));
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected.push_back(std::pair<size_t, bool>(3, true));
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected.push_back(std::pair<size_t, bool>(6, false));
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected.push_back(std::pair<size_t, bool>(7, true));
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(breaks.EqualsForTesting(expected));
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Setting a smaller max should remove any corresponding breaks.
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  breaks.SetMax(7);
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected.resize(4);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(breaks.EqualsForTesting(expected));
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  breaks.SetMax(4);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected.resize(3);
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(breaks.EqualsForTesting(expected));
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  breaks.SetMax(4);
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(breaks.EqualsForTesting(expected));
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Setting a larger max should not change any breaks.
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  breaks.SetMax(50);
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(breaks.EqualsForTesting(expected));
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(BreakListTest, GetBreakAndRange) {
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BreakList<bool> breaks(false);
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  breaks.SetMax(8);
137d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(true, Range(1, 2));
138d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  breaks.ApplyValue(true, Range(4, 6));
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct {
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_t position;
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_t break_index;
143d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    Range range;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } cases[] = {
145d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    { 0, 0, Range(0, 1) },
146d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    { 1, 1, Range(1, 2) },
147d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    { 2, 2, Range(2, 4) },
148d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    { 3, 2, Range(2, 4) },
149d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    { 4, 3, Range(4, 6) },
150d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    { 5, 3, Range(4, 6) },
151d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    { 6, 4, Range(6, 8) },
152d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    { 7, 4, Range(6, 8) },
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Positions at or beyond the max simply return the last break and range.
154d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    { 8, 4, Range(6, 8) },
155d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    { 9, 4, Range(6, 8) },
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BreakList<bool>::const_iterator it = breaks.GetBreak(cases[i].position);
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(breaks.breaks()[cases[i].break_index], *it);
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(breaks.GetRange(it), cases[i].range);
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace gfx
167