summaryrefslogtreecommitdiffstats
path: root/views/controls/scrollbar/scrollbar_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'views/controls/scrollbar/scrollbar_unittest.cc')
-rw-r--r--views/controls/scrollbar/scrollbar_unittest.cc150
1 files changed, 150 insertions, 0 deletions
diff --git a/views/controls/scrollbar/scrollbar_unittest.cc b/views/controls/scrollbar/scrollbar_unittest.cc
new file mode 100644
index 0000000..a19bfe6
--- /dev/null
+++ b/views/controls/scrollbar/scrollbar_unittest.cc
@@ -0,0 +1,150 @@
+// Copyright (c) 2011 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 "views/controls/scrollbar/scroll_bar.h"
+#include "views/controls/scrollbar/native_scroll_bar.h"
+#include "views/controls/scrollbar/native_scroll_bar_views.h"
+#include "views/test/views_test_base.h"
+#include "views/widget/widget.h"
+
+namespace {
+
+// The Scrollbar controller. This is the widget that should do the real
+// scrolling of contents.
+class TestScrollBarController : public views::ScrollBarController {
+ public:
+ virtual void ScrollToPosition(views::ScrollBar* source,
+ int position) OVERRIDE {
+ last_source = source;
+ last_position = position;
+ }
+
+ virtual int GetScrollIncrement(views::ScrollBar* source,
+ bool is_page,
+ bool is_positive) OVERRIDE {
+ last_source = source;
+ last_is_page = is_page;
+ last_is_positive = is_positive;
+
+ if (is_page)
+ return 20;
+ return 10;
+ }
+
+ // We save the last values in order to assert the corectness of the scroll
+ // operation.
+ views::ScrollBar* last_source;
+ bool last_is_positive;
+ bool last_is_page;
+ int last_position;
+};
+
+} // namespace
+
+namespace views {
+
+class NativeScrollBarTest : public ViewsTestBase {
+ public:
+ NativeScrollBarTest()
+ : widget_(NULL),
+ scrollbar_(NULL),
+ controller_(NULL) {
+ }
+
+ virtual void SetUp() {
+ ViewsTestBase::SetUp();
+ Widget::SetPureViews(true);
+ }
+
+ virtual void TearDown() {
+ Widget::SetPureViews(false);
+ if (widget_)
+ widget_->Close();
+ ViewsTestBase::TearDown();
+ }
+
+ void InitScrollBar() {
+ controller_.reset(new TestScrollBarController());
+
+ ASSERT_FALSE(scrollbar_);
+ native_scrollbar_ = new NativeScrollBar(true);
+ native_scrollbar_->SetBounds(0, 0, 100, 100);
+ scrollbar_ = new NativeScrollBarViews(native_scrollbar_);
+ scrollbar_->SetController(controller_.get());
+
+ widget_ = new Widget;
+ Widget::InitParams params(Widget::InitParams::TYPE_POPUP);
+ params.bounds = gfx::Rect(0, 0, 100, 100);
+ widget_->Init(params);
+ View* container = new View();
+ widget_->SetContentsView(container);
+ container->AddChildView(scrollbar_);
+ scrollbar_->SetBounds(0, 0, 100, 100);
+ scrollbar_->Update(100, 200, 0);
+
+ track_size_ = scrollbar_->GetTrackBounds().width();
+ }
+
+ protected:
+ Widget* widget_;
+
+ // This is the native scrollbar the Views one wraps around.
+ NativeScrollBar* native_scrollbar_;
+
+ // This is the Views scrollbar.
+ BaseScrollBar* scrollbar_;
+
+ // Keep track of the size of the track. This is how we can tell when we
+ // scroll to the middle.
+ int track_size_;
+
+ scoped_ptr<TestScrollBarController> controller_;
+};
+
+// TODO(dnicoara) Can't run the test on Windows since the scrollbar |Part|
+// isn't handled in NativeTheme.
+#if defined(OS_WIN)
+TEST_F(NativeScrollBarTest, DISABLED_Scrolling) {
+#else
+TEST_F(NativeScrollBarTest, Scrolling) {
+#endif
+ InitScrollBar();
+ EXPECT_EQ(scrollbar_->GetPosition(), 0);
+ EXPECT_EQ(scrollbar_->GetMaxPosition(), 100);
+ EXPECT_EQ(scrollbar_->GetMinPosition(), 0);
+
+ // Scroll to middle.
+ scrollbar_->ScrollToThumbPosition(track_size_ / 4, false);
+ EXPECT_EQ(controller_->last_position, 50);
+ EXPECT_EQ(controller_->last_source, native_scrollbar_);
+
+ // Scroll to the end.
+ scrollbar_->ScrollToThumbPosition(track_size_ / 2, false);
+ EXPECT_EQ(controller_->last_position, 100);
+
+ // Overscroll. Last position should be the maximum position.
+ scrollbar_->ScrollToThumbPosition(track_size_, false);
+ EXPECT_EQ(controller_->last_position, 100);
+
+ // Underscroll. Last position should be the minimum position.
+ scrollbar_->ScrollToThumbPosition(-10, false);
+ EXPECT_EQ(controller_->last_position, 0);
+
+ // Test the different fixed scrolling amounts. Generally used by buttons,
+ // or click on track.
+ scrollbar_->ScrollToThumbPosition(0, false);
+ scrollbar_->ScrollByAmount(BaseScrollBar::SCROLL_NEXT_LINE);
+ EXPECT_EQ(controller_->last_position, 10);
+
+ scrollbar_->ScrollByAmount(BaseScrollBar::SCROLL_PREV_LINE);
+ EXPECT_EQ(controller_->last_position, 0);
+
+ scrollbar_->ScrollByAmount(BaseScrollBar::SCROLL_NEXT_PAGE);
+ EXPECT_EQ(controller_->last_position, 20);
+
+ scrollbar_->ScrollByAmount(BaseScrollBar::SCROLL_PREV_PAGE);
+ EXPECT_EQ(controller_->last_position, 0);
+}
+
+} // namespace views