Index: chrome/browser/gtk/gtk_chrome_shrinkable_hbox_unittest.cc |
=================================================================== |
--- chrome/browser/gtk/gtk_chrome_shrinkable_hbox_unittest.cc (revision 71352) |
+++ chrome/browser/gtk/gtk_chrome_shrinkable_hbox_unittest.cc (working copy) |
@@ -1,254 +0,0 @@ |
-// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/gtk/gtk_chrome_shrinkable_hbox.h" |
- |
-#include <vector> |
- |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace { |
- |
-const int kSpacing = 3; |
-const int kBorderWidth = 5; |
- |
-} // namespace |
- |
-class GtkChromeShrinkableHBoxTest : public testing::Test { |
- protected: |
- GtkChromeShrinkableHBoxTest() |
- : window_(gtk_window_new(GTK_WINDOW_TOPLEVEL)), |
- box_(gtk_chrome_shrinkable_hbox_new(FALSE, FALSE, kSpacing)) { |
- gtk_widget_set_direction(box_, GTK_TEXT_DIR_LTR); |
- gtk_window_set_default_size(GTK_WINDOW(window_), 200, 200); |
- gtk_container_add(GTK_CONTAINER(window_), box_); |
- gtk_container_set_border_width(GTK_CONTAINER(box_), kBorderWidth); |
- } |
- |
- ~GtkChromeShrinkableHBoxTest() { |
- gtk_widget_destroy(window_); |
- } |
- |
- // Add some children widgets with arbitrary width and padding. |
- void AddChildren(bool pack_start) { |
- static struct { |
- int width; |
- int padding; |
- } kChildrenData[] = { |
- { 60, 2 }, |
- { 70, 3 }, |
- { 80, 5 }, |
- { 50, 7 }, |
- { 40, 11 }, |
- { 60, 0 }, |
- { 0, 0 } |
- }; |
- |
- for (size_t i = 0; kChildrenData[i].width; ++i) { |
- GtkWidget* child = gtk_fixed_new(); |
- gtk_widget_set_size_request(child, kChildrenData[i].width, -1); |
- if (pack_start) { |
- gtk_chrome_shrinkable_hbox_pack_start( |
- GTK_CHROME_SHRINKABLE_HBOX(box_), child, kChildrenData[i].padding); |
- } else { |
- gtk_chrome_shrinkable_hbox_pack_end( |
- GTK_CHROME_SHRINKABLE_HBOX(box_), child, kChildrenData[i].padding); |
- } |
- } |
- } |
- |
- // Check if all children's size allocation are inside the |box_|'s boundary. |
- void Validate(bool pack_start) { |
- std::vector<ChildData> children_data; |
- gtk_container_foreach(GTK_CONTAINER(box_), CollectChildData, |
- &children_data); |
- |
- size_t children_count = children_data.size(); |
- size_t visible_children_count = 0; |
- for (size_t i = 0; i < children_count; ++i) { |
- if (children_data[i].visible) |
- ++visible_children_count; |
- } |
- |
- if (visible_children_count == 0) |
- return; |
- |
- int border_width = gtk_container_get_border_width(GTK_CONTAINER(box_)); |
- int x = box_->allocation.x + border_width; |
- int width = box_->allocation.width - border_width * 2; |
- int spacing = gtk_box_get_spacing(GTK_BOX(box_)); |
- bool homogeneous = gtk_box_get_homogeneous(GTK_BOX(box_)); |
- |
- if (homogeneous) { |
- // If the |box_| is in homogeneous mode, then check if the visible |
- // children are not overlapped with each other. |
- int homogeneous_child_width = |
- (width - (visible_children_count - 1) * spacing) / |
- visible_children_count; |
- |
- for (size_t i = 0; i < children_count; ++i) { |
- SCOPED_TRACE(testing::Message() << "Validate homogeneous child " << i |
- << " visible: " << children_data[i].visible |
- << " padding: " << children_data[i].padding |
- << " x: " << children_data[i].x |
- << " width: " << children_data[i].width); |
- |
- if (children_data[i].visible) |
- ASSERT_LE(children_data[i].width, homogeneous_child_width); |
- } |
- } else { |
- // If the |box_| is not in homogeneous mode, then just check if all |
- // visible children are inside the |box_|'s boundary. And for those |
- // hidden children which are out of the boundary, they should only |
- // be hidden one by one from the end of the |box_|. |
- bool last_visible = pack_start; |
- bool visibility_changed = false; |
- for (size_t i = 0; i < children_count; ++i) { |
- SCOPED_TRACE(testing::Message() << "Validate child " << i |
- << " visible: " << children_data[i].visible |
- << " padding: " << children_data[i].padding |
- << " x: " << children_data[i].x |
- << " width: " << children_data[i].width); |
- |
- if (last_visible != children_data[i].visible) { |
- ASSERT_FALSE(visibility_changed); |
- visibility_changed = true; |
- last_visible = children_data[i].visible; |
- } |
- if (children_data[i].visible) { |
- ASSERT_GE(children_data[i].x, |
- x + children_data[i].padding); |
- ASSERT_LE(children_data[i].x + children_data[i].width, |
- x + width - children_data[i].padding); |
- } |
- } |
- } |
- } |
- |
- void Test(bool pack_start) { |
- gtk_widget_show_all(window_); |
- GtkAllocation allocation = { 0, 0, 0, 200 }; |
- gtk_chrome_shrinkable_hbox_set_hide_child_directly( |
- GTK_CHROME_SHRINKABLE_HBOX(box_), FALSE); |
- for (int width = 500; width > kBorderWidth * 2; --width) { |
- SCOPED_TRACE(testing::Message() << "Shrink hide_child_directly = FALSE," |
- << " width = " << width); |
- |
- allocation.width = width; |
- // Reducing the width may cause some children to be hidden, which will |
- // cause queue resize, so it's necessary to do another size allocation to |
- // emulate the queue resize. |
- gtk_widget_size_allocate(box_, &allocation); |
- gtk_widget_size_allocate(box_, &allocation); |
- ASSERT_NO_FATAL_FAILURE(Validate(pack_start)) << "width = " << width; |
- } |
- |
- for (int width = kBorderWidth * 2; width <= 500; ++width) { |
- SCOPED_TRACE(testing::Message() << "Expand hide_child_directly = FALSE," |
- << " width = " << width); |
- |
- allocation.width = width; |
- // Expanding the width may cause some invisible children to be shown, |
- // which will cause queue resize, so it's necessary to do another size |
- // allocation to emulate the queue resize. |
- gtk_widget_size_allocate(box_, &allocation); |
- gtk_widget_size_allocate(box_, &allocation); |
- ASSERT_NO_FATAL_FAILURE(Validate(pack_start)); |
- } |
- |
- gtk_chrome_shrinkable_hbox_set_hide_child_directly( |
- GTK_CHROME_SHRINKABLE_HBOX(box_), TRUE); |
- for (int width = 500; width > kBorderWidth * 2; --width) { |
- SCOPED_TRACE(testing::Message() << "Shrink hide_child_directly = TRUE," |
- << " width = " << width); |
- |
- allocation.width = width; |
- gtk_widget_size_allocate(box_, &allocation); |
- gtk_widget_size_allocate(box_, &allocation); |
- ASSERT_NO_FATAL_FAILURE(Validate(pack_start)); |
- } |
- |
- for (int width = kBorderWidth * 2; width <= 500; ++width) { |
- SCOPED_TRACE(testing::Message() << "Expand hide_child_directly = TRUE," |
- << " width = " << width); |
- |
- allocation.width = width; |
- gtk_widget_size_allocate(box_, &allocation); |
- gtk_widget_size_allocate(box_, &allocation); |
- ASSERT_NO_FATAL_FAILURE(Validate(pack_start)); |
- } |
- } |
- |
- protected: |
- GtkWidget* window_; |
- GtkWidget* box_; |
- |
- private: |
- struct ChildData { |
- bool visible; |
- int padding; |
- int x; |
- int width; |
- }; |
- |
- static void CollectChildData(GtkWidget* child, gpointer userdata) { |
- guint padding; |
- gtk_box_query_child_packing(GTK_BOX(gtk_widget_get_parent(child)), child, |
- NULL, NULL, &padding, NULL); |
- |
- ChildData data; |
- data.visible = GTK_WIDGET_VISIBLE(child); |
- data.padding = padding; |
- data.x = child->allocation.x; |
- data.width = child->allocation.width; |
- |
- reinterpret_cast<std::vector<ChildData>*>(userdata)->push_back(data); |
- } |
-}; |
- |
-TEST_F(GtkChromeShrinkableHBoxTest, PackStart) { |
- AddChildren(true); |
- |
- { |
- SCOPED_TRACE("Test LTR"); |
- gtk_widget_set_direction(box_, GTK_TEXT_DIR_LTR); |
- EXPECT_NO_FATAL_FAILURE(Test(true)); |
- } |
- { |
- SCOPED_TRACE("Test RTL"); |
- gtk_widget_set_direction(box_, GTK_TEXT_DIR_RTL); |
- EXPECT_NO_FATAL_FAILURE(Test(true)); |
- } |
-} |
- |
-TEST_F(GtkChromeShrinkableHBoxTest, PackEnd) { |
- AddChildren(false); |
- |
- { |
- SCOPED_TRACE("Test LTR"); |
- gtk_widget_set_direction(box_, GTK_TEXT_DIR_LTR); |
- EXPECT_NO_FATAL_FAILURE(Test(false)); |
- } |
- { |
- SCOPED_TRACE("Test RTL"); |
- gtk_widget_set_direction(box_, GTK_TEXT_DIR_RTL); |
- EXPECT_NO_FATAL_FAILURE(Test(false)); |
- } |
-} |
- |
-TEST_F(GtkChromeShrinkableHBoxTest, Homogeneous) { |
- AddChildren(true); |
- gtk_box_set_homogeneous(GTK_BOX(box_), true); |
- |
- { |
- SCOPED_TRACE("Test LTR"); |
- gtk_widget_set_direction(box_, GTK_TEXT_DIR_LTR); |
- EXPECT_NO_FATAL_FAILURE(Test(true)); |
- } |
- { |
- SCOPED_TRACE("Test RTL"); |
- gtk_widget_set_direction(box_, GTK_TEXT_DIR_RTL); |
- EXPECT_NO_FATAL_FAILURE(Test(true)); |
- } |
-} |