1// Copyright (c) 2011 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 "ui/gfx/range/range.h"
7
8TEST(RangeTest, EmptyInit) {
9  gfx::Range r;
10  EXPECT_EQ(0U, r.start());
11  EXPECT_EQ(0U, r.end());
12  EXPECT_EQ(0U, r.length());
13  EXPECT_FALSE(r.is_reversed());
14  EXPECT_TRUE(r.is_empty());
15  EXPECT_TRUE(r.IsValid());
16  EXPECT_EQ(0U, r.GetMin());
17  EXPECT_EQ(0U, r.GetMax());
18}
19
20TEST(RangeTest, StartEndInit) {
21  gfx::Range r(10, 15);
22  EXPECT_EQ(10U, r.start());
23  EXPECT_EQ(15U, r.end());
24  EXPECT_EQ(5U, r.length());
25  EXPECT_FALSE(r.is_reversed());
26  EXPECT_FALSE(r.is_empty());
27  EXPECT_TRUE(r.IsValid());
28  EXPECT_EQ(10U, r.GetMin());
29  EXPECT_EQ(15U, r.GetMax());
30}
31
32TEST(RangeTest, StartEndReversedInit) {
33  gfx::Range r(10, 5);
34  EXPECT_EQ(10U, r.start());
35  EXPECT_EQ(5U, r.end());
36  EXPECT_EQ(5U, r.length());
37  EXPECT_TRUE(r.is_reversed());
38  EXPECT_FALSE(r.is_empty());
39  EXPECT_TRUE(r.IsValid());
40  EXPECT_EQ(5U, r.GetMin());
41  EXPECT_EQ(10U, r.GetMax());
42}
43
44TEST(RangeTest, PositionInit) {
45  gfx::Range r(12);
46  EXPECT_EQ(12U, r.start());
47  EXPECT_EQ(12U, r.end());
48  EXPECT_EQ(0U, r.length());
49  EXPECT_FALSE(r.is_reversed());
50  EXPECT_TRUE(r.is_empty());
51  EXPECT_TRUE(r.IsValid());
52  EXPECT_EQ(12U, r.GetMin());
53  EXPECT_EQ(12U, r.GetMax());
54}
55
56TEST(RangeTest, InvalidRange) {
57  gfx::Range r(gfx::Range::InvalidRange());
58  EXPECT_EQ(0U, r.length());
59  EXPECT_EQ(r.start(), r.end());
60  EXPECT_FALSE(r.is_reversed());
61  EXPECT_TRUE(r.is_empty());
62  EXPECT_FALSE(r.IsValid());
63}
64
65TEST(RangeTest, Equality) {
66  gfx::Range r1(10, 4);
67  gfx::Range r2(10, 4);
68  gfx::Range r3(10, 2);
69  EXPECT_EQ(r1, r2);
70  EXPECT_NE(r1, r3);
71  EXPECT_NE(r2, r3);
72
73  gfx::Range r4(11, 4);
74  EXPECT_NE(r1, r4);
75  EXPECT_NE(r2, r4);
76  EXPECT_NE(r3, r4);
77
78  gfx::Range r5(12, 5);
79  EXPECT_NE(r1, r5);
80  EXPECT_NE(r2, r5);
81  EXPECT_NE(r3, r5);
82}
83
84TEST(RangeTest, EqualsIgnoringDirection) {
85  gfx::Range r1(10, 5);
86  gfx::Range r2(5, 10);
87  EXPECT_TRUE(r1.EqualsIgnoringDirection(r2));
88}
89
90TEST(RangeTest, SetStart) {
91  gfx::Range r(10, 20);
92  EXPECT_EQ(10U, r.start());
93  EXPECT_EQ(10U, r.length());
94
95  r.set_start(42);
96  EXPECT_EQ(42U, r.start());
97  EXPECT_EQ(20U, r.end());
98  EXPECT_EQ(22U, r.length());
99  EXPECT_TRUE(r.is_reversed());
100}
101
102TEST(RangeTest, SetEnd) {
103  gfx::Range r(10, 13);
104  EXPECT_EQ(10U, r.start());
105  EXPECT_EQ(3U, r.length());
106
107  r.set_end(20);
108  EXPECT_EQ(10U, r.start());
109  EXPECT_EQ(20U, r.end());
110  EXPECT_EQ(10U, r.length());
111}
112
113TEST(RangeTest, SetStartAndEnd) {
114  gfx::Range r;
115  r.set_end(5);
116  r.set_start(1);
117  EXPECT_EQ(1U, r.start());
118  EXPECT_EQ(5U, r.end());
119  EXPECT_EQ(4U, r.length());
120  EXPECT_EQ(1U, r.GetMin());
121  EXPECT_EQ(5U, r.GetMax());
122}
123
124TEST(RangeTest, ReversedRange) {
125  gfx::Range r(10, 5);
126  EXPECT_EQ(10U, r.start());
127  EXPECT_EQ(5U, r.end());
128  EXPECT_EQ(5U, r.length());
129  EXPECT_TRUE(r.is_reversed());
130  EXPECT_TRUE(r.IsValid());
131  EXPECT_EQ(5U, r.GetMin());
132  EXPECT_EQ(10U, r.GetMax());
133}
134
135TEST(RangeTest, SetReversedRange) {
136  gfx::Range r(10, 20);
137  r.set_start(25);
138  EXPECT_EQ(25U, r.start());
139  EXPECT_EQ(20U, r.end());
140  EXPECT_EQ(5U, r.length());
141  EXPECT_TRUE(r.is_reversed());
142  EXPECT_TRUE(r.IsValid());
143
144  r.set_end(21);
145  EXPECT_EQ(25U, r.start());
146  EXPECT_EQ(21U, r.end());
147  EXPECT_EQ(4U, r.length());
148  EXPECT_TRUE(r.IsValid());
149  EXPECT_EQ(21U, r.GetMin());
150  EXPECT_EQ(25U, r.GetMax());
151}
152
153void TestContainsAndIntersects(const gfx::Range& r1,
154                               const gfx::Range& r2,
155                               const gfx::Range& r3) {
156  EXPECT_TRUE(r1.Intersects(r1));
157  EXPECT_TRUE(r1.Contains(r1));
158  EXPECT_EQ(gfx::Range(10, 12), r1.Intersect(r1));
159
160  EXPECT_FALSE(r1.Intersects(r2));
161  EXPECT_FALSE(r1.Contains(r2));
162  EXPECT_TRUE(r1.Intersect(r2).is_empty());
163  EXPECT_FALSE(r2.Intersects(r1));
164  EXPECT_FALSE(r2.Contains(r1));
165  EXPECT_TRUE(r2.Intersect(r1).is_empty());
166
167  EXPECT_TRUE(r1.Intersects(r3));
168  EXPECT_TRUE(r3.Intersects(r1));
169  EXPECT_TRUE(r3.Contains(r1));
170  EXPECT_FALSE(r1.Contains(r3));
171  EXPECT_EQ(gfx::Range(10, 12), r1.Intersect(r3));
172  EXPECT_EQ(gfx::Range(10, 12), r3.Intersect(r1));
173
174  EXPECT_TRUE(r2.Intersects(r3));
175  EXPECT_TRUE(r3.Intersects(r2));
176  EXPECT_FALSE(r3.Contains(r2));
177  EXPECT_FALSE(r2.Contains(r3));
178  EXPECT_EQ(gfx::Range(5, 8), r2.Intersect(r3));
179  EXPECT_EQ(gfx::Range(5, 8), r3.Intersect(r2));
180}
181
182TEST(RangeTest, ContainAndIntersect) {
183  {
184    SCOPED_TRACE("contain and intersect");
185    gfx::Range r1(10, 12);
186    gfx::Range r2(1, 8);
187    gfx::Range r3(5, 12);
188    TestContainsAndIntersects(r1, r2, r3);
189  }
190  {
191    SCOPED_TRACE("contain and intersect: reversed");
192    gfx::Range r1(12, 10);
193    gfx::Range r2(8, 1);
194    gfx::Range r3(12, 5);
195    TestContainsAndIntersects(r1, r2, r3);
196  }
197  // Invalid rect tests
198  gfx::Range r1(10, 12);
199  gfx::Range r2(8, 1);
200  gfx::Range invalid = r1.Intersect(r2);
201  EXPECT_FALSE(invalid.IsValid());
202  EXPECT_FALSE(invalid.Contains(invalid));
203  EXPECT_FALSE(invalid.Contains(r1));
204  EXPECT_FALSE(invalid.Intersects(invalid));
205  EXPECT_FALSE(invalid.Intersects(r1));
206  EXPECT_FALSE(r1.Contains(invalid));
207  EXPECT_FALSE(r1.Intersects(invalid));
208}
209