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

Unified Diff: ui/views/cocoa/text_input_unittest.mm

Issue 329463002: MacViews: Implement text input. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 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
Index: ui/views/cocoa/text_input_unittest.mm
diff --git a/ui/views/cocoa/text_input_unittest.mm b/ui/views/cocoa/text_input_unittest.mm
new file mode 100644
index 0000000000000000000000000000000000000000..376cfcd95daf6e9bf4abfec26ef5320647f053b1
--- /dev/null
+++ b/ui/views/cocoa/text_input_unittest.mm
@@ -0,0 +1,142 @@
+// Copyright 2014 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/mac/scoped_nsobject.h"
tapted 2014/06/17 13:23:56 nit: import this and the other objc-only headers
Andre 2014/06/18 21:48:35 Done.
+#include "base/strings/sys_string_conversions.h"
+#include "base/strings/utf_string_conversions.h"
+#include "ui/gfx/test/ui_cocoa_test_helper.h"
+#include "ui/views/cocoa/bridged_content_view.h"
+#include "ui/views/controls/textfield/textfield.h"
+
+using base::ASCIIToUTF16;
+using base::SysNSStringToUTF8;
+using base::SysNSStringToUTF16;
+
+static NSRange EmptyRange = NSMakeRange(NSNotFound, 0);
tapted 2014/06/17 13:23:57 non-primitive statics aren't usually allowed - htt
Andre 2014/06/18 21:48:35 Done.
+
+#define EXPECT_EQ_RANGE(a, b) \
+ EXPECT_EQ(a.location, b.location); \
tapted 2014/06/17 13:23:57 I've seen EXPECT_TRUE(NSEqualRanges(a, b)) for stu
Andre 2014/06/18 21:48:35 I had it like that, but the failure output is much
+ EXPECT_EQ(a.length, b.length);
+
+namespace ui {
+namespace {
+
+class TextInputMacTest : public CocoaTest {
+ public:
+ virtual void SetUp() OVERRIDE {
+ textfield_.reset(new views::Textfield());
+ bridge_.reset([[BridgedContentView alloc] initWithView:textfield_.get()]);
tapted 2014/06/17 13:23:57 Somehting to consider - I've recently been finding
+ [bridge_ setTextInputClient:textfield_.get()];
+ }
+
+ // Returns the current text as std::string.
+ std::string GetText() {
+ NSAttributedString* text =
+ [bridge_ attributedSubstringForProposedRange:NSMakeRange(0, 1000)
tapted 2014/06/17 13:23:57 this 1000 should be a constant somewhere
Andre 2014/06/18 21:48:35 Done.
+ actualRange:NULL];
+ return SysNSStringToUTF8([text string]);
+ }
+
+ protected:
+ base::scoped_nsobject<BridgedContentView> bridge_;
+ scoped_ptr<views::Textfield> textfield_;
+};
tapted 2014/06/17 13:23:57 nit: private: DISALLOW_COPY_AND_ASSIGN(..) (you'
Andre 2014/06/18 21:48:35 Done.
+
+} // namespace
+
+TEST_F(TextInputMacTest, AttributedSubstring) {
tapted 2014/06/17 13:23:57 nit: it's sometimes nice to have a comment before
Andre 2014/06/18 21:48:35 Done.
+ NSRange range;
tapted 2014/06/17 13:23:57 Unless it's a constant, declarations are usually d
Andre 2014/06/18 21:48:35 Yeah, I did this way because the first use became
+ NSRange actualRange;
tapted 2014/06/17 13:23:57 actualRange -> actual_range, since it's not an obj
Andre 2014/06/18 21:48:35 Done.
+ NSAttributedString* text;
+
+ const char* str = "foo bar baz";
tapted 2014/06/17 13:23:57 I'd usually see `const char kTestString[] = "foo b
Andre 2014/06/18 21:48:35 Done.
+ textfield_->SetText(ASCIIToUTF16(str));
+
+ // Get the entire string.
+ range = NSMakeRange(0, 100);
+ text = [bridge_ attributedSubstringForProposedRange:range
+ actualRange:&actualRange];
+ EXPECT_EQ(str, SysNSStringToUTF8([text string]));
tapted 2014/06/17 13:23:57 There's also EXPECT_NSEQ from testing/gtest_mac.h
Andre 2014/06/18 21:48:35 Thanks, I don't think it will reduce the number of
+ EXPECT_EQ(range.location, actualRange.location);
+ EXPECT_EQ(strlen(str), actualRange.length);
+
+ // Get the middle of the text.
+ range = NSMakeRange(4, 3);
+ text = [bridge_ attributedSubstringForProposedRange:range
+ actualRange:&actualRange];
+ EXPECT_EQ("bar", SysNSStringToUTF8([text string]));
+ EXPECT_EQ_RANGE(range, actualRange);
+
+ // Get the end of the text.
+ range = NSMakeRange(8, 100);
+ text = [bridge_ attributedSubstringForProposedRange:range
+ actualRange:&actualRange];
+ EXPECT_EQ("baz", SysNSStringToUTF8([text string]));
+ EXPECT_EQ(range.location, actualRange.location);
+ EXPECT_EQ(strlen("baz"), actualRange.length);
+
+ // Test with empty range.
+ range = EmptyRange;
+ text = [bridge_ attributedSubstringForProposedRange:range
+ actualRange:&actualRange];
+ EXPECT_EQ("", SysNSStringToUTF8([text string]));
+ EXPECT_EQ_RANGE(range, actualRange);
+}
+
+TEST_F(TextInputMacTest, InsertText) {
+ NSString* str = @"foo";
tapted 2014/06/17 13:23:57 `str` probably counts as an abbreviation, so not a
Andre 2014/06/18 21:48:35 Done.
+ [bridge_ insertText:str replacementRange:EmptyRange];
+ gfx::Range range(0, [str length]);
+ base::string16 text;
+ EXPECT_TRUE(textfield_->GetTextFromRange(range, &text));
+ EXPECT_EQ(SysNSStringToUTF16(str), text);
+}
+
+TEST_F(TextInputMacTest, InsertTextWithReplacement) {
+ const char* old_text = "foo bar";
+ textfield_->SetText(ASCIIToUTF16(old_text));
+
+ [bridge_ insertText:@"baz" replacementRange:NSMakeRange(4, 3)];
+ EXPECT_EQ("foo baz", GetText());
+}
+
+TEST_F(TextInputMacTest, Composition) {
+ const char* str = "foo bar baz ";
+ textfield_->SetText(ASCIIToUTF16(str));
+ EXPECT_FALSE([bridge_ hasMarkedText]);
+ EXPECT_EQ_RANGE(EmptyRange, [bridge_ markedRange]);
+
+ // Start composition.
+ NSString* compositionText = @"qux";
+ NSUInteger compositionLength = [compositionText length];
+ [bridge_ setMarkedText:compositionText
+ selectedRange:NSMakeRange(0, 2)
+ replacementRange:EmptyRange];
+ EXPECT_TRUE([bridge_ hasMarkedText]);
+ EXPECT_EQ_RANGE(NSMakeRange(strlen(str), compositionLength),
+ [bridge_ markedRange]);
+ EXPECT_EQ_RANGE(NSMakeRange(strlen(str), 2), [bridge_ selectedRange]);
+
+ // Confirm composition.
+ [bridge_ unmarkText];
+ EXPECT_FALSE([bridge_ hasMarkedText]);
+ EXPECT_EQ_RANGE(EmptyRange, [bridge_ markedRange]);
+ EXPECT_EQ("foo bar baz qux", GetText());
+ EXPECT_EQ_RANGE(NSMakeRange(GetText().size(), 0), [bridge_ selectedRange]);
+}
+
+TEST_F(TextInputMacTest, MoveLeftRight) {
+ textfield_->SetText(ASCIIToUTF16("foo"));
+ EXPECT_EQ_RANGE(NSMakeRange(3, 0), [bridge_ selectedRange]);
+
+ // Move left
+ [bridge_ moveLeft:nil];
+ EXPECT_EQ_RANGE(NSMakeRange(2, 0), [bridge_ selectedRange]);
+
+ // Move right
+ [bridge_ moveRight:nil];
+ EXPECT_EQ_RANGE(NSMakeRange(3, 0), [bridge_ selectedRange]);
+}
+
+} // namespace ui

Powered by Google App Engine
This is Rietveld 408576698