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

Unified Diff: views/touchui/touch_selection_controller_impl_unittest.cc

Issue 7491090: Tests for TouchSelectoinControllerImpl. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Created 9 years, 4 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/touchui/touch_selection_controller_impl.cc ('k') | views/views.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: views/touchui/touch_selection_controller_impl_unittest.cc
diff --git a/views/touchui/touch_selection_controller_impl_unittest.cc b/views/touchui/touch_selection_controller_impl_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..a722af102a6f20742be301feda28c20047764b68
--- /dev/null
+++ b/views/touchui/touch_selection_controller_impl_unittest.cc
@@ -0,0 +1,189 @@
+// 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 "base/utf_string_conversions.h"
+#include "ui/gfx/point.h"
+#include "ui/gfx/rect.h"
+#include "ui/gfx/render_text.h"
+#include "views/controls/textfield/native_textfield_views.h"
+#include "views/controls/textfield/textfield.h"
+#include "views/test/views_test_base.h"
+#include "views/touchui/touch_selection_controller.h"
+#include "views/touchui/touch_selection_controller_impl.h"
+#include "views/widget/widget.h"
+
+namespace views {
+
+class TouchSelectionControllerImplTest : public ViewsTestBase {
+ public:
+ TouchSelectionControllerImplTest()
+ : widget_(NULL),
+ textfield_(NULL),
+ textfield_view_(NULL) {
+ }
+
+ virtual void SetUp() {
+ Widget::SetPureViews(true);
+ }
+
+ virtual void TearDown() {
+ Widget::SetPureViews(false);
+ if (widget_)
+ widget_->Close();
+ ViewsTestBase::TearDown();
+ }
+
+ void CreateTextfield() {
+ textfield_ = new Textfield();
+ 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(textfield_);
+
+ textfield_view_ = static_cast<NativeTextfieldViews*>(
+ textfield_->GetNativeWrapperForTesting());
+ textfield_view_->SetBoundsRect(params.bounds);
+ textfield_->set_id(1);
+
+ DCHECK(textfield_view_);
+ textfield_->RequestFocus();
+ }
+
+ protected:
+ gfx::Point GetCursorPosition(int cursor_pos) {
+ gfx::RenderText* render_text = textfield_view_->GetRenderText();
+ gfx::Rect cursor_bounds = render_text->GetCursorBounds(
+ gfx::SelectionModel(cursor_pos), false);
+ gfx::Rect display_rect = render_text->display_rect();
+ int total_offset_x = display_rect.x() + render_text->display_offset().x();
+ int total_offset_y = display_rect.y() + render_text->display_offset().y() +
+ (display_rect.height() - cursor_bounds.height()) / 2;
+ return gfx::Point(cursor_bounds.x() + total_offset_x,
+ cursor_bounds.bottom() + total_offset_y);
+ }
+
+ TouchSelectionControllerImpl* GetSelectionController() {
+ return static_cast<TouchSelectionControllerImpl*>(
+ textfield_view_->touch_selection_controller_.get());
+ }
+
+ void SimulateSelectionHandleDrag(gfx::Point p, int selection_handle) {
+ TouchSelectionControllerImpl* controller = GetSelectionController();
+ // Do the work of OnMousePressed().
+ if (selection_handle == 1)
+ controller->dragging_handle_ = controller->selection_handle_1_.get();
+ else
+ controller->dragging_handle_ = controller->selection_handle_2_.get();
+
+ controller->SelectionHandleDragged(p);
+
+ // Do the work of OnMouseReleased().
+ controller->dragging_handle_ = NULL;
+ }
+
+ // If textfield has selection, this method verifies that the selection handles
+ // are visible and at the correct positions (at the end points of selection).
+ // |cursor_at_selection_handle_1| is used to decide whether selection
+ // handle 1's position is matched against the start of selection or the end.
+ void VerifySelectionHandlePositions(bool cursor_at_selection_handle_1) {
+ if (textfield_->HasSelection()) {
+ EXPECT_TRUE(GetSelectionController()->IsSelectionHandle1Visible());
+ EXPECT_TRUE(GetSelectionController()->IsSelectionHandle2Visible());
+ ui::Range selected_range;
+ textfield_view_->GetSelectedRange(&selected_range);
+ gfx::Point selection_start = GetCursorPosition(selected_range.start());
+ gfx::Point selection_end = GetCursorPosition(selected_range.end());
+ gfx::Point sh1 = GetSelectionController()->GetSelectionHandle1Position();
+ gfx::Point sh2 = GetSelectionController()->GetSelectionHandle2Position();
+ sh1.Offset(10, 0); // offset by kSelectionHandleRadius.
+ sh2.Offset(10, 0);
+
+ if (cursor_at_selection_handle_1) {
+ EXPECT_EQ(sh1, selection_end);
+ EXPECT_EQ(sh2, selection_start);
+ } else {
+ EXPECT_EQ(sh1, selection_start);
+ EXPECT_EQ(sh2, selection_end);
+ }
+ } else {
+ EXPECT_FALSE(GetSelectionController()->IsSelectionHandle1Visible());
+ EXPECT_FALSE(GetSelectionController()->IsSelectionHandle2Visible());
+ }
+ }
+
+ Widget* widget_;
+
+ Textfield* textfield_;
+ NativeTextfieldViews* textfield_view_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(TouchSelectionControllerImplTest);
+};
+
+// Tests that the selection handles are placed appropriately when selection in
+// a Textfield changes.
+TEST_F(TouchSelectionControllerImplTest, SelectionInTextfieldTest) {
+ CreateTextfield();
+ textfield_->SetText(ASCIIToUTF16("some text"));
+
+ // Test selecting a range.
+ textfield_->SelectRange(ui::Range(3, 7));
+ VerifySelectionHandlePositions(false);
+
+ // Test selecting everything.
+ textfield_->SelectAll();
+ VerifySelectionHandlePositions(false);
+
+ // Test with no selection.
+ textfield_->ClearSelection();
+ VerifySelectionHandlePositions(false);
+
+ // Test with lost focus.
+ widget_->GetFocusManager()->ClearFocus();
+ VerifySelectionHandlePositions(false);
+
+ // Test with focus re-gained.
+ widget_->GetFocusManager()->SetFocusedView(textfield_);
+ VerifySelectionHandlePositions(false);
+}
+
+// Tests if the SelectRect callback is called appropriately when selection
+// handles are moved.
+TEST_F(TouchSelectionControllerImplTest, SelectRectCallbackTest) {
+ CreateTextfield();
+ textfield_->SetText(ASCIIToUTF16("textfield with selected text"));
+ textfield_->SelectRange(ui::Range(3, 7));
+
+ EXPECT_EQ(UTF16ToUTF8(textfield_->GetSelectedText()), "tfie");
+ VerifySelectionHandlePositions(false);
+
+ // Drag selection handle 2 to right by 3 chars.
+ int x = textfield_->font().GetStringWidth(ASCIIToUTF16("ld "));
+ SimulateSelectionHandleDrag(gfx::Point(x, 0), 2);
+ EXPECT_EQ(UTF16ToUTF8(textfield_->GetSelectedText()), "tfield ");
+ VerifySelectionHandlePositions(false);
+
+ // Drag selection handle 1 to the left by a large amount (selection should
+ // just stick to the beginning of the textfield).
+ SimulateSelectionHandleDrag(gfx::Point(-50, 0), 1);
+ EXPECT_EQ(UTF16ToUTF8(textfield_->GetSelectedText()), "textfield ");
+ VerifySelectionHandlePositions(true);
+
+ // Drag selection handle 1 across selection handle 2.
+ x = textfield_->font().GetStringWidth(ASCIIToUTF16("textfield with "));
+ SimulateSelectionHandleDrag(gfx::Point(x, 0), 1);
+ EXPECT_EQ(UTF16ToUTF8(textfield_->GetSelectedText()), "with ");
+ VerifySelectionHandlePositions(true);
+
+ // Drag selection handle 2 across selection handle 1.
+ x = textfield_->font().GetStringWidth(ASCIIToUTF16("with selected "));
+ SimulateSelectionHandleDrag(gfx::Point(x, 0), 2);
+ EXPECT_EQ(UTF16ToUTF8(textfield_->GetSelectedText()), "selected ");
+ VerifySelectionHandlePositions(false);
+}
+
+} // namespace views
« no previous file with comments | « views/touchui/touch_selection_controller_impl.cc ('k') | views/views.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698