Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(883)

Unified Diff: views/controls/single_split_view_unittest.cc

Issue 6247001: Re-land 71230.... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « views/controls/single_split_view.cc ('k') | views/examples/single_split_view_example.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: views/controls/single_split_view_unittest.cc
===================================================================
--- views/controls/single_split_view_unittest.cc (revision 0)
+++ views/controls/single_split_view_unittest.cc (revision 0)
@@ -0,0 +1,176 @@
+// 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 "base/logging.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "views/controls/single_split_view.h"
+
+using ::testing::_;
+using ::testing::Return;
+
+namespace {
+
+static void VerifySplitViewLayout(const views::SingleSplitView& split) {
+ ASSERT_EQ(2, split.GetChildViewCount());
+
+ views::View* leading = split.GetChildViewAt(0);
+ views::View* trailing = split.GetChildViewAt(1);
+
+ if (split.bounds().IsEmpty()) {
+ EXPECT_TRUE(leading->bounds().IsEmpty());
+ EXPECT_TRUE(trailing->bounds().IsEmpty());
+ return;
+ }
+
+ EXPECT_FALSE(leading->bounds().IsEmpty());
+ EXPECT_FALSE(trailing->bounds().IsEmpty());
+ EXPECT_FALSE(leading->bounds().Intersects(trailing->bounds()));
+
+ if (split.orientation() == views::SingleSplitView::HORIZONTAL_SPLIT) {
+ EXPECT_EQ(leading->bounds().height(), split.bounds().height());
+ EXPECT_EQ(trailing->bounds().height(), split.bounds().height());
+ EXPECT_LT(leading->bounds().width() + trailing->bounds().width(),
+ split.bounds().width());
+ } else if (split.orientation() == views::SingleSplitView::VERTICAL_SPLIT) {
+ EXPECT_EQ(leading->bounds().width(), split.bounds().width());
+ EXPECT_EQ(trailing->bounds().width(), split.bounds().width());
+ EXPECT_LT(leading->bounds().height() + trailing->bounds().height(),
+ split.bounds().height());
+ } else {
+ NOTREACHED();
+ }
+}
+
+class MockObserver : public views::SingleSplitView::Observer {
+ public:
+ MOCK_METHOD1(SplitHandleMoved, bool(views::SingleSplitView*));
+};
+
+} // namespace
+
+namespace views {
+
+TEST(SingleSplitViewTest, Resize) {
+ // Test cases to iterate through for horizontal and vertical split views.
+ struct TestCase {
+ // Split view resize policy for this test case.
+ bool resize_leading_on_bounds_change;
+ // Split view size to set.
+ int primary_axis_size;
+ int secondary_axis_size;
+ // Expected divider offset.
+ int divider_offset;
+ } test_cases[] = {
+ // The initial split size is 100x100, divider at 33.
+ { true, 100, 100, 33 },
+ // Grow the split view, leading view should grow.
+ { true, 1000, 100, 933 },
+ // Shrink the split view, leading view should shrink.
+ { true, 200, 100, 133 },
+ // Minimize the split view, divider should not move.
+ { true, 0, 0, 133 },
+ // Restore the split view, divider should not move.
+ { false, 500, 100, 133 },
+ // Resize the split view by secondary axis, divider should not move.
+ { false, 500, 600, 133 }
+ };
+
+ SingleSplitView::Orientation orientations[] = {
+ SingleSplitView::HORIZONTAL_SPLIT,
+ SingleSplitView::VERTICAL_SPLIT
+ };
+
+ for (size_t orientation = 0; orientation < arraysize(orientations);
+ ++orientation) {
+ // Create a split view.
+ SingleSplitView split(
+ new View(), new View(), orientations[orientation], NULL);
+
+ // Set initial size and divider offset.
+ EXPECT_EQ(test_cases[0].primary_axis_size,
+ test_cases[0].secondary_axis_size);
+ split.SetBounds(0, 0, test_cases[0].primary_axis_size,
+ test_cases[0].secondary_axis_size);
+ split.set_divider_offset(test_cases[0].divider_offset);
+ split.Layout();
+
+ // Run all test cases.
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) {
+ split.set_resize_leading_on_bounds_change(
+ test_cases[i].resize_leading_on_bounds_change);
+ if (split.orientation() == SingleSplitView::HORIZONTAL_SPLIT) {
+ split.SetBounds(0, 0, test_cases[i].primary_axis_size,
+ test_cases[i].secondary_axis_size);
+ } else {
+ split.SetBounds(0, 0, test_cases[i].secondary_axis_size,
+ test_cases[i].primary_axis_size);
+ }
+
+ EXPECT_EQ(test_cases[i].divider_offset, split.divider_offset());
+ VerifySplitViewLayout(split);
+ }
+
+ // Special cases, one of the child views is hidden.
+ split.GetChildViewAt(0)->SetVisible(false);
+ split.Layout();
+
+ EXPECT_EQ(split.bounds().size(),
+ split.GetChildViewAt(1)->bounds().size());
+
+ split.GetChildViewAt(0)->SetVisible(true);
+ split.GetChildViewAt(1)->SetVisible(false);
+ split.Layout();
+
+ EXPECT_EQ(split.bounds().size(),
+ split.GetChildViewAt(0)->bounds().size());
+ }
+}
+
+TEST(SingleSplitViewTest, MouseDrag) {
+ MockObserver observer;
+ SingleSplitView split(
+ new View(), new View(), SingleSplitView::VERTICAL_SPLIT, &observer);
+
+ ON_CALL(observer, SplitHandleMoved(_))
+ .WillByDefault(Return(true));
+ // SplitHandleMoved is expected to be called once for every mouse move.
+ EXPECT_CALL(observer, SplitHandleMoved(_))
+ .Times(2);
+
+ split.SetBounds(0, 0, 10, 100);
+ const int kInitialDividerOffset = 33;
+ const int kMouseOffset = 2; // Mouse offset in the divider.
+ const int kMouseMoveDelta = 7;
+ split.set_divider_offset(kInitialDividerOffset);
+ split.Layout();
+
+ // Drag divider to the right, in 2 steps.
+ MouseEvent mouse_pressed(
+ Event::ET_MOUSE_PRESSED, 7, kInitialDividerOffset + kMouseOffset, 0);
+ ASSERT_TRUE(split.OnMousePressed(mouse_pressed));
+ EXPECT_EQ(kInitialDividerOffset, split.divider_offset());
+
+ MouseEvent mouse_dragged_1(
+ Event::ET_MOUSE_DRAGGED, 5,
+ kInitialDividerOffset + kMouseOffset + kMouseMoveDelta, 0);
+ ASSERT_TRUE(split.OnMouseDragged(mouse_dragged_1));
+ EXPECT_EQ(kInitialDividerOffset + kMouseMoveDelta, split.divider_offset());
+
+ MouseEvent mouse_dragged_2(
+ Event::ET_MOUSE_DRAGGED, 6,
+ kInitialDividerOffset + kMouseOffset + kMouseMoveDelta * 2, 0);
+ ASSERT_TRUE(split.OnMouseDragged(mouse_dragged_2));
+ EXPECT_EQ(kInitialDividerOffset + kMouseMoveDelta * 2,
+ split.divider_offset());
+
+ MouseEvent mouse_released(
+ Event::ET_MOUSE_RELEASED, 7,
+ kInitialDividerOffset + kMouseOffset + kMouseMoveDelta * 2, 0);
+ split.OnMouseReleased(mouse_released, false);
+ EXPECT_EQ(kInitialDividerOffset + kMouseMoveDelta * 2,
+ split.divider_offset());
+}
+
+} // namespace views
Property changes on: views/controls/single_split_view_unittest.cc
___________________________________________________________________
Added: svn:eol-style
+ LF
« no previous file with comments | « views/controls/single_split_view.cc ('k') | views/examples/single_split_view_example.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698