Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <string> | 5 #include <string> |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 42 | 42 |
| 43 TEST_F(StyledLabelTest, NoWrapping) { | 43 TEST_F(StyledLabelTest, NoWrapping) { |
| 44 const std::string text("This is a test block of text"); | 44 const std::string text("This is a test block of text"); |
| 45 InitStyledLabel(text); | 45 InitStyledLabel(text); |
| 46 Label label(ASCIIToUTF16(text)); | 46 Label label(ASCIIToUTF16(text)); |
| 47 const gfx::Size label_preferred_size = label.GetPreferredSize(); | 47 const gfx::Size label_preferred_size = label.GetPreferredSize(); |
| 48 EXPECT_EQ(label_preferred_size.height(), | 48 EXPECT_EQ(label_preferred_size.height(), |
| 49 StyledLabelContentHeightForWidth(label_preferred_size.width() * 2)); | 49 StyledLabelContentHeightForWidth(label_preferred_size.width() * 2)); |
| 50 } | 50 } |
| 51 | 51 |
| 52 TEST_F(StyledLabelTest, TrailingWhitespaceiIgnored) { | |
| 53 const std::string text("This is a test block of text "); | |
| 54 InitStyledLabel(text); | |
| 55 | |
| 56 styled()->SetBounds(0, 0, 1000, 1000); | |
| 57 styled()->Layout(); | |
| 58 | |
| 59 ASSERT_EQ(Label::kViewClassName, styled()->child_at(0)->GetClassName()); | |
|
sky
2013/03/28 16:02:09
Don't you need an assert on on child_count() (same
tbarzic
2013/03/28 20:33:58
yeah, I forgot to add them in these two.
| |
| 60 EXPECT_EQ(ASCIIToUTF16("This is a test block of text"), | |
| 61 static_cast<Label*>(styled()->child_at(0))->text()); | |
| 62 } | |
| 63 | |
| 64 TEST_F(StyledLabelTest, LeadingWhitespaceiIgnored) { | |
| 65 const std::string text(" This is a test block of text"); | |
| 66 InitStyledLabel(text); | |
| 67 | |
| 68 styled()->SetBounds(0, 0, 1000, 1000); | |
| 69 styled()->Layout(); | |
| 70 | |
| 71 ASSERT_EQ(Label::kViewClassName, styled()->child_at(0)->GetClassName()); | |
| 72 EXPECT_EQ(ASCIIToUTF16("This is a test block of text"), | |
| 73 static_cast<Label*>(styled()->child_at(0))->text()); | |
| 74 } | |
| 75 | |
| 52 TEST_F(StyledLabelTest, BasicWrapping) { | 76 TEST_F(StyledLabelTest, BasicWrapping) { |
| 53 const std::string text("This is a test block of text"); | 77 const std::string text("This is a test block of text"); |
| 54 InitStyledLabel(text); | 78 InitStyledLabel(text); |
| 55 Label label(ASCIIToUTF16(text.substr(0, text.size() * 2 / 3))); | 79 Label label(ASCIIToUTF16(text.substr(0, text.size() * 2 / 3))); |
| 56 gfx::Size label_preferred_size = label.GetPreferredSize(); | 80 gfx::Size label_preferred_size = label.GetPreferredSize(); |
| 57 EXPECT_EQ(label_preferred_size.height() * 2, | 81 EXPECT_EQ(label_preferred_size.height() * 2, |
| 58 StyledLabelContentHeightForWidth(label_preferred_size.width())); | 82 StyledLabelContentHeightForWidth(label_preferred_size.width())); |
| 59 | 83 |
| 60 // Also respect the border. | 84 // Also respect the border. |
| 61 styled()->set_border(Border::CreateEmptyBorder(3, 3, 3, 3)); | 85 styled()->set_border(Border::CreateEmptyBorder(3, 3, 3, 3)); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 97 EXPECT_EQ(label_preferred_size.height() * 2, | 121 EXPECT_EQ(label_preferred_size.height() * 2, |
| 98 pref_height - styled()->GetInsets().height()); | 122 pref_height - styled()->GetInsets().height()); |
| 99 | 123 |
| 100 styled()->SetBounds(0, 0, label_preferred_size.width(), pref_height); | 124 styled()->SetBounds(0, 0, label_preferred_size.width(), pref_height); |
| 101 styled()->Layout(); | 125 styled()->Layout(); |
| 102 ASSERT_EQ(2, styled()->child_count()); | 126 ASSERT_EQ(2, styled()->child_count()); |
| 103 EXPECT_EQ(0, styled()->child_at(0)->bounds().x()); | 127 EXPECT_EQ(0, styled()->child_at(0)->bounds().x()); |
| 104 EXPECT_EQ(0, styled()->child_at(1)->bounds().x()); | 128 EXPECT_EQ(0, styled()->child_at(1)->bounds().x()); |
| 105 } | 129 } |
| 106 | 130 |
| 131 TEST_F(StyledLabelTest, StyledRangeWithDisabledLineWrapping) { | |
| 132 const std::string text("This is a test block of text, "); | |
| 133 const std::string unbreakable_text("and this should not be breaked"); | |
| 134 InitStyledLabel(text + unbreakable_text); | |
| 135 StyledLabel::RangeStyleInfo style_info; | |
| 136 style_info.disable_line_wrapping = true; | |
| 137 styled()->AddStyleRange( | |
| 138 ui::Range(text.size(), text.size() + unbreakable_text.size()), | |
| 139 style_info); | |
| 140 | |
| 141 Label label(ASCIIToUTF16( | |
| 142 text + unbreakable_text.substr(0, unbreakable_text.size() / 2))); | |
| 143 gfx::Size label_preferred_size = label.GetPreferredSize(); | |
| 144 int pref_height = styled()->GetHeightForWidth(label_preferred_size.width()); | |
| 145 EXPECT_EQ(label_preferred_size.height() * 2, | |
| 146 pref_height - styled()->GetInsets().height()); | |
| 147 | |
| 148 styled()->SetBounds(0, 0, label_preferred_size.width(), pref_height); | |
| 149 styled()->Layout(); | |
| 150 ASSERT_EQ(2, styled()->child_count()); | |
| 151 EXPECT_EQ(0, styled()->child_at(0)->bounds().x()); | |
| 152 EXPECT_EQ(0, styled()->child_at(1)->bounds().x()); | |
| 153 } | |
| 154 | |
| 155 TEST_F(StyledLabelTest, StyledRangeUnderlined) { | |
| 156 const std::string text("This is a test block of text, "); | |
| 157 const std::string underlined_text("and this should be undelined"); | |
| 158 InitStyledLabel(text + underlined_text); | |
| 159 StyledLabel::RangeStyleInfo style_info; | |
| 160 style_info.font_style = gfx::Font::UNDERLINE; | |
| 161 styled()->AddStyleRange( | |
| 162 ui::Range(text.size(), text.size() + underlined_text.size()), | |
| 163 style_info); | |
| 164 | |
| 165 styled()->SetBounds(0, 0, 1000, 1000); | |
| 166 styled()->Layout(); | |
| 167 | |
| 168 ASSERT_EQ(2, styled()->child_count()); | |
| 169 ASSERT_EQ(Label::kViewClassName, styled()->child_at(1)->GetClassName()); | |
| 170 EXPECT_EQ(gfx::Font::UNDERLINE, | |
| 171 static_cast<Label*>(styled()->child_at(1))->font().GetStyle()); | |
| 172 } | |
| 173 | |
| 174 TEST_F(StyledLabelTest, StyledRangeBold) { | |
| 175 const std::string bold_text( | |
| 176 "This is a block of text whose style will be set to BOLD in the test"); | |
| 177 const std::string text(" normal text"); | |
| 178 InitStyledLabel(bold_text + text); | |
| 179 | |
| 180 StyledLabel::RangeStyleInfo style_info; | |
| 181 style_info.font_style = gfx::Font::BOLD; | |
| 182 styled()->AddStyleRange(ui::Range(0, bold_text.size()), style_info); | |
| 183 | |
| 184 // Calculate the bold text width if it were a pure label view, both with bold | |
| 185 // and normal style. | |
| 186 Label label(ASCIIToUTF16(bold_text)); | |
| 187 const gfx::Size normal_label_size = label.GetPreferredSize(); | |
| 188 label.SetFont(label.font().DeriveFont(0, gfx::Font::BOLD)); | |
| 189 const gfx::Size bold_label_size = label.GetPreferredSize(); | |
| 190 | |
| 191 ASSERT_GE(bold_label_size.width(), normal_label_size.width()); | |
| 192 | |
| 193 // Set the width so |bold_text| doesn't fit in a single line with bold style, | |
| 194 // but does with normal font style. | |
|
Evan Stade
2013/03/27 22:25:11
can you have the test make sure the second asserti
tbarzic
2013/03/28 20:33:58
Done.
| |
| 195 int styled_width = (normal_label_size.width() + bold_label_size.width()) / 2; | |
| 196 int pref_height = styled()->GetHeightForWidth(styled_width); | |
| 197 | |
| 198 styled()->SetBounds(0, 0, styled_width, pref_height); | |
| 199 styled()->Layout(); | |
| 200 | |
| 201 ASSERT_EQ(3, styled()->child_count()); | |
| 202 | |
| 203 // The bold text should be broken up into two parts. | |
| 204 ASSERT_EQ(Label::kViewClassName, styled()->child_at(0)->GetClassName()); | |
| 205 EXPECT_EQ(gfx::Font::BOLD, | |
| 206 static_cast<Label*>(styled()->child_at(0))->font().GetStyle()); | |
| 207 ASSERT_EQ(Label::kViewClassName, styled()->child_at(1)->GetClassName()); | |
| 208 EXPECT_EQ(gfx::Font::BOLD, | |
| 209 static_cast<Label*>(styled()->child_at(1))->font().GetStyle()); | |
| 210 ASSERT_EQ(Label::kViewClassName, styled()->child_at(2)->GetClassName()); | |
| 211 EXPECT_EQ(gfx::Font::NORMAL, | |
| 212 static_cast<Label*>(styled()->child_at(2))->font().GetStyle()); | |
| 213 | |
| 214 // The second bold part should start in a new line. | |
|
Evan Stade
2013/03/27 22:25:11
nit: on a new line.
tbarzic
2013/03/28 20:33:58
Done.
| |
| 215 EXPECT_EQ(0, styled()->child_at(0)->bounds().x()); | |
| 216 EXPECT_EQ(0, styled()->child_at(1)->bounds().x()); | |
| 217 EXPECT_EQ(styled()->child_at(1)->bounds().right() - 2, | |
| 218 styled()->child_at(2)->bounds().x()); | |
| 219 } | |
| 220 | |
| 221 TEST_F(StyledLabelTest, StyledRangeWithTooltip) { | |
| 222 const std::string text("This is a test block of text, "); | |
| 223 const std::string tooltip_text("this should have a tooltip,"); | |
| 224 const std::string normal_text(" this should not have a tooltip, "); | |
| 225 const std::string link_text("and this should be a link"); | |
| 226 | |
| 227 const size_t tooltip_start = text.size(); | |
| 228 const size_t link_start = | |
| 229 text.size() + tooltip_text.size() + normal_text.size(); | |
| 230 | |
| 231 InitStyledLabel(text + tooltip_text + normal_text + link_text); | |
| 232 StyledLabel::RangeStyleInfo tooltip_style; | |
| 233 tooltip_style.tooltip = ASCIIToUTF16("tooltip"); | |
| 234 styled()->AddStyleRange( | |
| 235 ui::Range(tooltip_start, tooltip_start + tooltip_text.size()), | |
| 236 tooltip_style); | |
| 237 styled()->AddLink(ui::Range(link_start, link_start + link_text.size())); | |
| 238 | |
| 239 // Break line inside the range with the tooltip. | |
| 240 Label label(ASCIIToUTF16( | |
| 241 text + tooltip_text.substr(0, tooltip_text.size() - 3))); | |
| 242 gfx::Size label_preferred_size = label.GetPreferredSize(); | |
| 243 int pref_height = styled()->GetHeightForWidth(label_preferred_size.width()); | |
| 244 EXPECT_EQ(label_preferred_size.height() * 3, | |
| 245 pref_height - styled()->GetInsets().height()); | |
| 246 | |
| 247 styled()->SetBounds(0, 0, label_preferred_size.width(), pref_height); | |
| 248 styled()->Layout(); | |
| 249 | |
| 250 EXPECT_EQ(label_preferred_size.width(), styled()->width()); | |
| 251 | |
| 252 ASSERT_EQ(5, styled()->child_count()); | |
| 253 EXPECT_EQ(0, styled()->child_at(0)->bounds().x()); | |
| 254 EXPECT_EQ(styled()->child_at(0)->bounds().right() - 2, | |
| 255 styled()->child_at(1)->bounds().x()); | |
| 256 EXPECT_EQ(0, styled()->child_at(2)->bounds().x()); | |
| 257 EXPECT_EQ(styled()->child_at(2)->bounds().right() - 2, | |
| 258 styled()->child_at(3)->bounds().x()); | |
| 259 EXPECT_EQ(0, styled()->child_at(4)->bounds().x()); | |
| 260 | |
| 261 string16 tooltip; | |
| 262 EXPECT_TRUE( | |
| 263 styled()->child_at(1)->GetTooltipText(gfx::Point(1, 1), &tooltip)); | |
| 264 EXPECT_EQ(ASCIIToUTF16("tooltip"), tooltip); | |
| 265 EXPECT_TRUE( | |
| 266 styled()->child_at(2)->GetTooltipText(gfx::Point(1, 1), &tooltip)); | |
| 267 EXPECT_EQ(ASCIIToUTF16("tooltip"), tooltip); | |
| 268 } | |
| 269 | |
| 107 TEST_F(StyledLabelTest, HandleEmptyLayout) { | 270 TEST_F(StyledLabelTest, HandleEmptyLayout) { |
| 108 const std::string text("This is a test block of text, "); | 271 const std::string text("This is a test block of text, "); |
| 109 InitStyledLabel(text); | 272 InitStyledLabel(text); |
| 110 styled()->Layout(); | 273 styled()->Layout(); |
| 111 ASSERT_EQ(0, styled()->child_count()); | 274 ASSERT_EQ(0, styled()->child_count()); |
| 112 } | 275 } |
| 113 | 276 |
| 114 } // namespace | 277 } // namespace |
| OLD | NEW |