gtk_expanded_container_unittest.cc revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
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 "chrome/browser/ui/gtk/gtk_expanded_container.h"
6
7#include "testing/gtest/include/gtest/gtest.h"
8
9class GtkExpandedContainerTest : public testing::Test {
10 protected:
11  GtkExpandedContainerTest()
12      : window_(gtk_window_new(GTK_WINDOW_TOPLEVEL)),
13        expanded_(gtk_expanded_container_new()) {
14    gtk_window_set_default_size(GTK_WINDOW(window_), 200, 200);
15    gtk_container_add(GTK_CONTAINER(window_), expanded_);
16  }
17  ~GtkExpandedContainerTest() {
18    gtk_widget_destroy(window_);
19  }
20
21  bool FindChild(GtkWidget* widget) {
22    GList* children = gtk_container_get_children(GTK_CONTAINER(expanded_));
23    for (GList* child = children; child; child = child->next) {
24      if (GTK_WIDGET(child->data) == widget) {
25        g_list_free(children);
26        return true;
27      }
28    }
29    g_list_free(children);
30    return false;
31  }
32
33  int GetChildX(GtkWidget* widget) {
34    GValue x = { 0 };
35    g_value_init(&x, G_TYPE_INT);
36    gtk_container_child_get_property(GTK_CONTAINER(expanded_), widget, "x", &x);
37    return g_value_get_int(&x);
38  }
39
40  int GetChildY(GtkWidget* widget) {
41    GValue y = { 0 };
42    g_value_init(&y, G_TYPE_INT);
43    gtk_container_child_get_property(GTK_CONTAINER(expanded_), widget, "y", &y);
44    return g_value_get_int(&y);
45  }
46
47 protected:
48  GtkWidget* window_;
49  GtkWidget* expanded_;
50};
51
52TEST_F(GtkExpandedContainerTest, AddRemove) {
53  GtkWidget* child1 = gtk_fixed_new();
54  GtkWidget* child2 = gtk_fixed_new();
55  gtk_container_add(GTK_CONTAINER(expanded_), child1);
56  ASSERT_TRUE(FindChild(child1));
57
58  gtk_container_add(GTK_CONTAINER(expanded_), child2);
59  ASSERT_TRUE(FindChild(child2));
60  ASSERT_TRUE(FindChild(child1));
61
62  gtk_container_remove(GTK_CONTAINER(expanded_), child1);
63  ASSERT_FALSE(FindChild(child1));
64  ASSERT_TRUE(FindChild(child2));
65
66  gtk_container_remove(GTK_CONTAINER(expanded_), child2);
67  ASSERT_FALSE(FindChild(child2));
68}
69
70TEST_F(GtkExpandedContainerTest, Expand) {
71  GtkWidget* child1 = gtk_fixed_new();
72  GtkWidget* child2 = gtk_fixed_new();
73  gtk_container_add(GTK_CONTAINER(expanded_), child1);
74  gtk_expanded_container_put(GTK_EXPANDED_CONTAINER(expanded_),
75                             child2, 10, 20);
76  gtk_widget_show_all(window_);
77
78  GtkAllocation allocation = { 0, 0, 50, 100 };
79  gtk_widget_size_allocate(expanded_, &allocation);
80
81  EXPECT_EQ(0, child1->allocation.x);
82  EXPECT_EQ(0, child1->allocation.y);
83  EXPECT_EQ(50, child1->allocation.width);
84  EXPECT_EQ(100, child1->allocation.height);
85
86  EXPECT_EQ(10, child2->allocation.x);
87  EXPECT_EQ(20, child2->allocation.y);
88  EXPECT_EQ(50, child2->allocation.width);
89  EXPECT_EQ(100, child2->allocation.height);
90
91  allocation.x = 10;
92  allocation.y = 20;
93  gtk_widget_size_allocate(expanded_, &allocation);
94
95  EXPECT_EQ(10, child1->allocation.x);
96  EXPECT_EQ(20, child1->allocation.y);
97  EXPECT_EQ(20, child2->allocation.x);
98  EXPECT_EQ(40, child2->allocation.y);
99}
100
101// Test if the size allocation for children still works when using own
102// GdkWindow. In this case, the children's origin starts from (0, 0) rather
103// than the container's origin.
104TEST_F(GtkExpandedContainerTest, HasWindow) {
105  GtkWidget* child = gtk_fixed_new();
106  gtk_container_add(GTK_CONTAINER(expanded_), child);
107  gtk_expanded_container_set_has_window(GTK_EXPANDED_CONTAINER(expanded_),
108                                        TRUE);
109  gtk_widget_show_all(window_);
110
111  GtkAllocation allocation = { 10, 10, 50, 100 };
112  gtk_widget_size_allocate(expanded_, &allocation);
113
114  EXPECT_EQ(0, child->allocation.x);
115  EXPECT_EQ(0, child->allocation.y);
116  EXPECT_EQ(50, child->allocation.width);
117  EXPECT_EQ(100, child->allocation.height);
118}
119
120static void OnChildSizeRequest(GtkExpandedContainer* container,
121                               GtkWidget* child,
122                               GtkRequisition* requisition,
123                               gpointer userdata) {
124  ASSERT_EQ(child, GTK_WIDGET(userdata));
125  requisition->width = 250;
126  requisition->height = -1;
127}
128
129TEST_F(GtkExpandedContainerTest, ChildSizeRequest) {
130  GtkWidget* child = gtk_fixed_new();
131  gtk_widget_set_size_request(child, 10, 25);
132  g_signal_connect(expanded_, "child-size-request",
133                   G_CALLBACK(OnChildSizeRequest), child);
134  gtk_container_add(GTK_CONTAINER(expanded_), child);
135  gtk_widget_show_all(window_);
136
137  GtkAllocation allocation = { 0, 0, 300, 100 };
138  gtk_widget_size_allocate(expanded_, &allocation);
139
140  EXPECT_EQ(0, child->allocation.x);
141  EXPECT_EQ(0, child->allocation.y);
142  EXPECT_EQ(250, child->allocation.width);
143  EXPECT_EQ(25, child->allocation.height);
144}
145
146TEST_F(GtkExpandedContainerTest, ChildPosition) {
147  GtkWidget* child = gtk_fixed_new();
148  gtk_expanded_container_put(GTK_EXPANDED_CONTAINER(expanded_),
149                             child, 10, 20);
150  gtk_widget_show_all(window_);
151
152  EXPECT_EQ(10, GetChildX(child));
153  EXPECT_EQ(20, GetChildY(child));
154
155  gtk_expanded_container_move(GTK_EXPANDED_CONTAINER(expanded_),
156                              child, 40, 50);
157  EXPECT_EQ(40, GetChildX(child));
158  EXPECT_EQ(50, GetChildY(child));
159}
160