| // Copyright 2017 PDFium 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 "fpdfsdk/pwl/cpwl_edit.h" | |
| #include "fpdfsdk/cpdfsdk_annot.h" | |
| #include "fpdfsdk/cpdfsdk_annotiterator.h" | |
| #include "fpdfsdk/cpdfsdk_formfillenvironment.h" | |
| #include "fpdfsdk/cpdfsdk_helpers.h" | |
| #include "fpdfsdk/formfiller/cffl_formfiller.h" | |
| #include "fpdfsdk/formfiller/cffl_interactiveformfiller.h" | |
| #include "public/fpdf_fwlevent.h" | |
| #include "testing/embedder_test.h" | |
| #include "testing/gtest/include/gtest/gtest.h" | |
| class CPWLEditEmbedderTest : public EmbedderTest { | |
| protected: | |
| void SetUp() override { | |
| EmbedderTest::SetUp(); | |
| CreateAndInitializeFormPDF(); | |
| } | |
| void TearDown() override { | |
| UnloadPage(GetPage()); | |
| EmbedderTest::TearDown(); | |
| } | |
| void CreateAndInitializeFormPDF() { | |
| ASSERT_TRUE(OpenDocument("text_form_multiple.pdf")); | |
| m_page = LoadPage(0); | |
| ASSERT_TRUE(m_page); | |
| m_pFormFillEnv = | |
| CPDFSDKFormFillEnvironmentFromFPDFFormHandle(form_handle()); | |
| CPDFSDK_AnnotIterator iter(m_pFormFillEnv->GetPageViewAtIndex(0), | |
| CPDF_Annot::Subtype::WIDGET); | |
| // Normal text field. | |
| m_pAnnot = iter.GetFirstAnnot(); | |
| ASSERT_TRUE(m_pAnnot); | |
| ASSERT_EQ(CPDF_Annot::Subtype::WIDGET, m_pAnnot->GetAnnotSubtype()); | |
| // Read-only text field. | |
| CPDFSDK_Annot* pAnnotReadOnly = iter.GetNextAnnot(m_pAnnot); | |
| // Pre-filled text field with char limit of 10. | |
| m_pAnnotCharLimit = iter.GetNextAnnot(pAnnotReadOnly); | |
| ASSERT_TRUE(m_pAnnotCharLimit); | |
| ASSERT_EQ(CPDF_Annot::Subtype::WIDGET, | |
| m_pAnnotCharLimit->GetAnnotSubtype()); | |
| // Password text field. | |
| CPDFSDK_Annot* password_annot = iter.GetNextAnnot(m_pAnnotCharLimit); | |
| ASSERT_TRUE(password_annot); | |
| ASSERT_EQ(CPDF_Annot::Subtype::WIDGET, password_annot->GetAnnotSubtype()); | |
| CPDFSDK_Annot* pLastAnnot = iter.GetLastAnnot(); | |
| ASSERT_EQ(password_annot, pLastAnnot); | |
| } | |
| void FormFillerAndWindowSetup(CPDFSDK_Annot* pAnnotTextField) { | |
| CFFL_InteractiveFormFiller* pInteractiveFormFiller = | |
| m_pFormFillEnv->GetInteractiveFormFiller(); | |
| { | |
| ObservedPtr<CPDFSDK_Annot> pObserved(pAnnotTextField); | |
| EXPECT_TRUE(pInteractiveFormFiller->OnSetFocus(&pObserved, 0)); | |
| } | |
| m_pFormFiller = | |
| pInteractiveFormFiller->GetFormFillerForTesting(pAnnotTextField); | |
| ASSERT_TRUE(m_pFormFiller); | |
| CPWL_Wnd* pWindow = m_pFormFiller->GetPWLWindow( | |
| m_pFormFillEnv->GetPageViewAtIndex(0), false); | |
| ASSERT_TRUE(pWindow); | |
| m_pEdit = static_cast<CPWL_Edit*>(pWindow); | |
| } | |
| void TypeTextIntoTextField(int num_chars) { | |
| // Type text starting with 'A' to as many chars as specified by |num_chars|. | |
| for (int i = 0; i < num_chars; ++i) { | |
| EXPECT_TRUE(GetCFFLFormFiller()->OnChar(GetCPDFSDKAnnot(), i + 'A', 0)); | |
| } | |
| } | |
| FPDF_PAGE GetPage() { return m_page; } | |
| CPWL_Edit* GetCPWLEdit() { return m_pEdit; } | |
| CFFL_FormFiller* GetCFFLFormFiller() { return m_pFormFiller; } | |
| CPDFSDK_Annot* GetCPDFSDKAnnot() { return m_pAnnot; } | |
| CPDFSDK_Annot* GetCPDFSDKAnnotCharLimit() { return m_pAnnotCharLimit; } | |
| private: | |
| FPDF_PAGE m_page; | |
| CPWL_Edit* m_pEdit; | |
| CFFL_FormFiller* m_pFormFiller; | |
| CPDFSDK_Annot* m_pAnnot; | |
| CPDFSDK_Annot* m_pAnnotCharLimit; | |
| CPDFSDK_FormFillEnvironment* m_pFormFillEnv; | |
| }; | |
| TEST_F(CPWLEditEmbedderTest, TypeText) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnot()); | |
| EXPECT_TRUE(GetCPWLEdit()->GetText().IsEmpty()); | |
| EXPECT_TRUE(GetCFFLFormFiller()->OnChar(GetCPDFSDKAnnot(), 'a', 0)); | |
| EXPECT_TRUE(GetCFFLFormFiller()->OnChar(GetCPDFSDKAnnot(), 'b', 0)); | |
| EXPECT_TRUE(GetCFFLFormFiller()->OnChar(GetCPDFSDKAnnot(), 'c', 0)); | |
| EXPECT_STREQ(L"abc", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, GetSelectedTextEmptyAndBasic) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnot()); | |
| // Attempt to set selection before text has been typed to test that | |
| // selection is identified as empty. | |
| // | |
| // Select from character index [0, 3) within form text field. | |
| GetCPWLEdit()->SetSelection(0, 3); | |
| EXPECT_TRUE(GetCPWLEdit()->GetSelectedText().IsEmpty()); | |
| EXPECT_TRUE(GetCFFLFormFiller()->OnChar(GetCPDFSDKAnnot(), 'a', 0)); | |
| EXPECT_TRUE(GetCFFLFormFiller()->OnChar(GetCPDFSDKAnnot(), 'b', 0)); | |
| EXPECT_TRUE(GetCFFLFormFiller()->OnChar(GetCPDFSDKAnnot(), 'c', 0)); | |
| GetCPWLEdit()->SetSelection(0, 2); | |
| EXPECT_STREQ(L"ab", GetCPWLEdit()->GetSelectedText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, GetSelectedTextFragments) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnot()); | |
| TypeTextIntoTextField(50); | |
| GetCPWLEdit()->SetSelection(0, 0); | |
| EXPECT_TRUE(GetCPWLEdit()->GetSelectedText().IsEmpty()); | |
| GetCPWLEdit()->SetSelection(0, 1); | |
| EXPECT_STREQ(L"A", GetCPWLEdit()->GetSelectedText().c_str()); | |
| GetCPWLEdit()->SetSelection(0, -1); | |
| EXPECT_STREQ(L"ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqr", | |
| GetCPWLEdit()->GetSelectedText().c_str()); | |
| GetCPWLEdit()->SetSelection(-8, -1); | |
| EXPECT_TRUE(GetCPWLEdit()->GetSelectedText().IsEmpty()); | |
| GetCPWLEdit()->SetSelection(23, 12); | |
| EXPECT_STREQ(L"MNOPQRSTUVW", GetCPWLEdit()->GetSelectedText().c_str()); | |
| GetCPWLEdit()->SetSelection(12, 23); | |
| EXPECT_STREQ(L"MNOPQRSTUVW", GetCPWLEdit()->GetSelectedText().c_str()); | |
| GetCPWLEdit()->SetSelection(49, 50); | |
| EXPECT_STREQ(L"r", GetCPWLEdit()->GetSelectedText().c_str()); | |
| GetCPWLEdit()->SetSelection(49, 55); | |
| EXPECT_STREQ(L"r", GetCPWLEdit()->GetSelectedText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, DeleteEntireTextSelection) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnot()); | |
| TypeTextIntoTextField(50); | |
| GetCPWLEdit()->SetSelection(0, -1); | |
| EXPECT_STREQ(L"ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqr", | |
| GetCPWLEdit()->GetSelectedText().c_str()); | |
| GetCPWLEdit()->ReplaceSelection(L""); | |
| EXPECT_TRUE(GetCPWLEdit()->GetText().IsEmpty()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, DeleteTextSelectionMiddle) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnot()); | |
| TypeTextIntoTextField(50); | |
| GetCPWLEdit()->SetSelection(12, 23); | |
| EXPECT_STREQ(L"MNOPQRSTUVW", GetCPWLEdit()->GetSelectedText().c_str()); | |
| GetCPWLEdit()->ReplaceSelection(L""); | |
| EXPECT_STREQ(L"ABCDEFGHIJKLXYZ[\\]^_`abcdefghijklmnopqr", | |
| GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, DeleteTextSelectionLeft) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnot()); | |
| TypeTextIntoTextField(50); | |
| GetCPWLEdit()->SetSelection(0, 5); | |
| EXPECT_STREQ(L"ABCDE", GetCPWLEdit()->GetSelectedText().c_str()); | |
| GetCPWLEdit()->ReplaceSelection(L""); | |
| EXPECT_STREQ(L"FGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqr", | |
| GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, DeleteTextSelectionRight) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnot()); | |
| TypeTextIntoTextField(50); | |
| GetCPWLEdit()->SetSelection(45, 50); | |
| EXPECT_STREQ(L"nopqr", GetCPWLEdit()->GetSelectedText().c_str()); | |
| GetCPWLEdit()->ReplaceSelection(L""); | |
| EXPECT_STREQ(L"ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklm", | |
| GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, DeleteEmptyTextSelection) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnot()); | |
| TypeTextIntoTextField(50); | |
| GetCPWLEdit()->ReplaceSelection(L""); | |
| EXPECT_STREQ(L"ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqr", | |
| GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, InsertTextInEmptyTextField) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnot()); | |
| GetCPWLEdit()->ReplaceSelection(L"Hello"); | |
| EXPECT_STREQ(L"Hello", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, InsertTextInPopulatedTextFieldLeft) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnot()); | |
| TypeTextIntoTextField(10); | |
| // Move cursor to beginning of text field. | |
| EXPECT_TRUE(GetCFFLFormFiller()->OnKeyDown(FWL_VKEY_Home, 0)); | |
| GetCPWLEdit()->ReplaceSelection(L"Hello"); | |
| EXPECT_STREQ(L"HelloABCDEFGHIJ", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, InsertTextInPopulatedTextFieldMiddle) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnot()); | |
| TypeTextIntoTextField(10); | |
| // Move cursor to middle of text field. | |
| for (int i = 0; i < 5; ++i) { | |
| EXPECT_TRUE(GetCFFLFormFiller()->OnKeyDown(FWL_VKEY_Left, 0)); | |
| } | |
| GetCPWLEdit()->ReplaceSelection(L"Hello"); | |
| EXPECT_STREQ(L"ABCDEHelloFGHIJ", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, InsertTextInPopulatedTextFieldRight) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnot()); | |
| TypeTextIntoTextField(10); | |
| GetCPWLEdit()->ReplaceSelection(L"Hello"); | |
| EXPECT_STREQ(L"ABCDEFGHIJHello", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, | |
| InsertTextAndReplaceSelectionInPopulatedTextFieldWhole) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnot()); | |
| TypeTextIntoTextField(10); | |
| GetCPWLEdit()->SetSelection(0, -1); | |
| EXPECT_STREQ(L"ABCDEFGHIJ", GetCPWLEdit()->GetSelectedText().c_str()); | |
| GetCPWLEdit()->ReplaceSelection(L"Hello"); | |
| EXPECT_STREQ(L"Hello", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, | |
| InsertTextAndReplaceSelectionInPopulatedTextFieldLeft) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnot()); | |
| TypeTextIntoTextField(10); | |
| GetCPWLEdit()->SetSelection(0, 5); | |
| EXPECT_STREQ(L"ABCDE", GetCPWLEdit()->GetSelectedText().c_str()); | |
| GetCPWLEdit()->ReplaceSelection(L"Hello"); | |
| EXPECT_STREQ(L"HelloFGHIJ", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, | |
| InsertTextAndReplaceSelectionInPopulatedTextFieldMiddle) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnot()); | |
| TypeTextIntoTextField(10); | |
| GetCPWLEdit()->SetSelection(2, 7); | |
| EXPECT_STREQ(L"CDEFG", GetCPWLEdit()->GetSelectedText().c_str()); | |
| GetCPWLEdit()->ReplaceSelection(L"Hello"); | |
| EXPECT_STREQ(L"ABHelloHIJ", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, | |
| InsertTextAndReplaceSelectionInPopulatedTextFieldRight) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnot()); | |
| TypeTextIntoTextField(10); | |
| GetCPWLEdit()->SetSelection(5, 10); | |
| EXPECT_STREQ(L"FGHIJ", GetCPWLEdit()->GetSelectedText().c_str()); | |
| GetCPWLEdit()->ReplaceSelection(L"Hello"); | |
| EXPECT_STREQ(L"ABCDEHello", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, InsertTextInEmptyCharLimitTextFieldOverflow) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnotCharLimit()); | |
| GetCPWLEdit()->SetSelection(0, -1); | |
| EXPECT_STREQ(L"Elephant", GetCPWLEdit()->GetSelectedText().c_str()); | |
| GetCPWLEdit()->ReplaceSelection(L""); | |
| GetCPWLEdit()->ReplaceSelection(L"Hippopotamus"); | |
| EXPECT_STREQ(L"Hippopotam", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, InsertTextInEmptyCharLimitTextFieldFit) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnotCharLimit()); | |
| GetCPWLEdit()->SetSelection(0, -1); | |
| EXPECT_STREQ(L"Elephant", GetCPWLEdit()->GetSelectedText().c_str()); | |
| GetCPWLEdit()->ReplaceSelection(L""); | |
| GetCPWLEdit()->ReplaceSelection(L"Zebra"); | |
| EXPECT_STREQ(L"Zebra", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, InsertTextInPopulatedCharLimitTextFieldLeft) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnotCharLimit()); | |
| GetCPWLEdit()->ReplaceSelection(L"Hippopotamus"); | |
| EXPECT_STREQ(L"HiElephant", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, InsertTextInPopulatedCharLimitTextFieldMiddle) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnotCharLimit()); | |
| // Move cursor to middle of text field. | |
| for (int i = 0; i < 5; ++i) { | |
| EXPECT_TRUE(GetCFFLFormFiller()->OnKeyDown(FWL_VKEY_Right, 0)); | |
| } | |
| GetCPWLEdit()->ReplaceSelection(L"Hippopotamus"); | |
| EXPECT_STREQ(L"ElephHiant", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, InsertTextInPopulatedCharLimitTextFieldRight) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnotCharLimit()); | |
| // Move cursor to end of text field. | |
| EXPECT_TRUE(GetCFFLFormFiller()->OnKeyDown(FWL_VKEY_End, 0)); | |
| GetCPWLEdit()->ReplaceSelection(L"Hippopotamus"); | |
| EXPECT_STREQ(L"ElephantHi", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, | |
| InsertTextAndReplaceSelectionInPopulatedCharLimitTextFieldWhole) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnotCharLimit()); | |
| GetCPWLEdit()->SetSelection(0, -1); | |
| EXPECT_STREQ(L"Elephant", GetCPWLEdit()->GetSelectedText().c_str()); | |
| GetCPWLEdit()->ReplaceSelection(L"Hippopotamus"); | |
| EXPECT_STREQ(L"Hippopotam", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, | |
| InsertTextAndReplaceSelectionInPopulatedCharLimitTextFieldLeft) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnotCharLimit()); | |
| GetCPWLEdit()->SetSelection(0, 4); | |
| EXPECT_STREQ(L"Elep", GetCPWLEdit()->GetSelectedText().c_str()); | |
| GetCPWLEdit()->ReplaceSelection(L"Hippopotamus"); | |
| EXPECT_STREQ(L"Hippophant", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, | |
| InsertTextAndReplaceSelectionInPopulatedCharLimitTextFieldMiddle) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnotCharLimit()); | |
| GetCPWLEdit()->SetSelection(2, 6); | |
| EXPECT_STREQ(L"epha", GetCPWLEdit()->GetSelectedText().c_str()); | |
| GetCPWLEdit()->ReplaceSelection(L"Hippopotamus"); | |
| EXPECT_STREQ(L"ElHippopnt", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, | |
| InsertTextAndReplaceSelectionInPopulatedCharLimitTextFieldRight) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnotCharLimit()); | |
| GetCPWLEdit()->SetSelection(4, 8); | |
| EXPECT_STREQ(L"hant", GetCPWLEdit()->GetSelectedText().c_str()); | |
| GetCPWLEdit()->ReplaceSelection(L"Hippopotamus"); | |
| EXPECT_STREQ(L"ElepHippop", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, SetTextWithEndCarriageFeed) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnot()); | |
| GetCPWLEdit()->SetText(L"Foo\r"); | |
| EXPECT_STREQ(L"Foo", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, SetTextWithEndNewline) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnot()); | |
| GetCPWLEdit()->SetText(L"Foo\n"); | |
| EXPECT_STREQ(L"Foo", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, SetTextWithEndCarriageFeedAndNewLine) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnot()); | |
| GetCPWLEdit()->SetText(L"Foo\r\n"); | |
| EXPECT_STREQ(L"Foo", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, SetTextWithEndNewLineAndCarriageFeed) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnot()); | |
| GetCPWLEdit()->SetText(L"Foo\n\r"); | |
| EXPECT_STREQ(L"Foo", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, SetTextWithBodyCarriageFeed) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnot()); | |
| GetCPWLEdit()->SetText(L"Foo\rBar"); | |
| EXPECT_STREQ(L"FooBar", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, SetTextWithBodyNewline) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnot()); | |
| GetCPWLEdit()->SetText(L"Foo\nBar"); | |
| EXPECT_STREQ(L"FooBar", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, SetTextWithBodyCarriageFeedAndNewLine) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnot()); | |
| GetCPWLEdit()->SetText(L"Foo\r\nBar"); | |
| EXPECT_STREQ(L"FooBar", GetCPWLEdit()->GetText().c_str()); | |
| } | |
| TEST_F(CPWLEditEmbedderTest, SetTextWithBodyNewLineAndCarriageFeed) { | |
| FormFillerAndWindowSetup(GetCPDFSDKAnnot()); | |
| GetCPWLEdit()->SetText(L"Foo\n\rBar"); | |
| EXPECT_STREQ(L"FooBar", GetCPWLEdit()->GetText().c_str()); | |
| } |