// Copyright 2017 The PDFium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "fpdfsdk/pwl/cpwl_combo_box_embeddertest.h" #include "fpdfsdk/cpdfsdk_formfillenvironment.h" #include "fpdfsdk/cpdfsdk_helpers.h" #include "fpdfsdk/cpdfsdk_widget.h" #include "fpdfsdk/formfiller/cffl_formfield.h" #include "fpdfsdk/formfiller/cffl_interactiveformfiller.h" #include "fpdfsdk/pwl/cpwl_combo_box.h" #include "fpdfsdk/pwl/cpwl_wnd.h" #include "public/fpdf_fwlevent.h" #include "testing/embedder_test.h" #include "testing/gtest/include/gtest/gtest.h" class CPWLComboBoxEditEmbedderTest : public CPWLComboBoxEmbedderTest {}; TEST_F(CPWLComboBoxEditEmbedderTest, GetSelectedTextEmptyAndBasicNormal) { FormFillerAndWindowSetup(GetCPDFSDKAnnotNormal()); // Automatically pre-filled with "Banana". EXPECT_FALSE(GetCPWLComboBox()->GetText().IsEmpty()); EXPECT_STREQ(L"Banana", GetCPWLComboBox()->GetText().c_str()); // Check that selection is initially empty, then select entire word. EXPECT_TRUE(GetCPWLComboBox()->GetSelectedText().IsEmpty()); GetCPWLComboBox()->SetSelectText(); EXPECT_STREQ(L"Banana", GetCPWLComboBox()->GetSelectedText().c_str()); // Select other options. GetCPWLComboBox()->SetSelect(0); EXPECT_STREQ(L"Apple", GetCPWLComboBox()->GetSelectedText().c_str()); GetCPWLComboBox()->SetSelect(2); EXPECT_STREQ(L"Cherry", GetCPWLComboBox()->GetSelectedText().c_str()); // Verify that combobox text cannot be edited. EXPECT_FALSE(GetCFFLFormField()->OnChar(GetCPDFSDKAnnotNormal(), 'a', {})); } TEST_F(CPWLComboBoxEditEmbedderTest, GetSelectedTextFragmentsNormal) { FormFillerAndWindowSetup(GetCPDFSDKAnnotNormal()); EXPECT_STREQ(L"Banana", GetCPWLComboBox()->GetText().c_str()); GetCPWLComboBox()->SetEditSelection(0, 0); EXPECT_TRUE(GetCPWLComboBox()->GetSelectedText().IsEmpty()); GetCPWLComboBox()->SetEditSelection(0, 1); EXPECT_STREQ(L"B", GetCPWLComboBox()->GetSelectedText().c_str()); GetCPWLComboBox()->SetEditSelection(0, -1); EXPECT_STREQ(L"Banana", GetCPWLComboBox()->GetSelectedText().c_str()); GetCPWLComboBox()->SetEditSelection(-8, -1); EXPECT_TRUE(GetCPWLComboBox()->GetSelectedText().IsEmpty()); GetCPWLComboBox()->SetEditSelection(4, 1); EXPECT_STREQ(L"ana", GetCPWLComboBox()->GetSelectedText().c_str()); GetCPWLComboBox()->SetEditSelection(1, 4); EXPECT_STREQ(L"ana", GetCPWLComboBox()->GetSelectedText().c_str()); GetCPWLComboBox()->SetEditSelection(5, 6); EXPECT_STREQ(L"a", GetCPWLComboBox()->GetSelectedText().c_str()); } TEST_F(CPWLComboBoxEditEmbedderTest, GetSelectedTextEmptyAndBasicEditable) { FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable()); EXPECT_TRUE(GetCPWLComboBox()->GetText().IsEmpty()); // Check selection is initially empty, then select a provided option. EXPECT_TRUE(GetCPWLComboBox()->GetSelectedText().IsEmpty()); GetCPWLComboBox()->SetSelect(0); GetCPWLComboBox()->SetSelectText(); EXPECT_STREQ(L"Foo", GetCPWLComboBox()->GetSelectedText().c_str()); // Select another option and then select last char of that option. GetCPWLComboBox()->SetSelect(1); EXPECT_STREQ(L"Bar", GetCPWLComboBox()->GetSelectedText().c_str()); GetCPWLComboBox()->SetEditSelection(2, 3); EXPECT_STREQ(L"r", GetCPWLComboBox()->GetSelectedText().c_str()); // Type into editable combobox text field and select new text. EXPECT_TRUE( GetCFFLFormField()->OnChar(GetCPDFSDKAnnotUserEditable(), 'a', {})); EXPECT_TRUE( GetCFFLFormField()->OnChar(GetCPDFSDKAnnotUserEditable(), 'b', {})); EXPECT_TRUE( GetCFFLFormField()->OnChar(GetCPDFSDKAnnotUserEditable(), 'c', {})); EXPECT_TRUE(GetCPWLComboBox()->GetSelectedText().IsEmpty()); GetCPWLComboBox()->SetEditSelection(0, 5); EXPECT_STREQ(L"Baabc", GetCPWLComboBox()->GetSelectedText().c_str()); } TEST_F(CPWLComboBoxEditEmbedderTest, GetSelectedTextFragmentsEditable) { FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable()); TypeTextIntoTextField(50); GetCPWLComboBox()->SetEditSelection(0, 0); EXPECT_TRUE(GetCPWLComboBox()->GetSelectedText().IsEmpty()); GetCPWLComboBox()->SetEditSelection(0, 1); EXPECT_STREQ(L"A", GetCPWLComboBox()->GetSelectedText().c_str()); GetCPWLComboBox()->SetEditSelection(0, -1); EXPECT_STREQ(L"ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqr", GetCPWLComboBox()->GetSelectedText().c_str()); GetCPWLComboBox()->SetEditSelection(-8, -1); EXPECT_TRUE(GetCPWLComboBox()->GetSelectedText().IsEmpty()); GetCPWLComboBox()->SetEditSelection(23, 12); EXPECT_STREQ(L"MNOPQRSTUVW", GetCPWLComboBox()->GetSelectedText().c_str()); GetCPWLComboBox()->SetEditSelection(12, 23); EXPECT_STREQ(L"MNOPQRSTUVW", GetCPWLComboBox()->GetSelectedText().c_str()); GetCPWLComboBox()->SetEditSelection(49, 50); EXPECT_STREQ(L"r", GetCPWLComboBox()->GetSelectedText().c_str()); GetCPWLComboBox()->SetEditSelection(49, 55); EXPECT_STREQ(L"r", GetCPWLComboBox()->GetSelectedText().c_str()); } TEST_F(CPWLComboBoxEditEmbedderTest, DeleteEntireTextSelection) { FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable()); TypeTextIntoTextField(50); GetCPWLComboBox()->SetEditSelection(0, -1); EXPECT_STREQ(L"ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqr", GetCPWLComboBox()->GetSelectedText().c_str()); GetCPWLComboBox()->ReplaceSelection(L""); EXPECT_TRUE(GetCPWLComboBox()->GetText().IsEmpty()); } TEST_F(CPWLComboBoxEditEmbedderTest, DeleteTextSelectionMiddle) { FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable()); TypeTextIntoTextField(50); GetCPWLComboBox()->SetEditSelection(12, 23); EXPECT_STREQ(L"MNOPQRSTUVW", GetCPWLComboBox()->GetSelectedText().c_str()); GetCPWLComboBox()->ReplaceSelection(L""); EXPECT_STREQ(L"ABCDEFGHIJKLXYZ[\\]^_`abcdefghijklmnopqr", GetCPWLComboBox()->GetText().c_str()); } TEST_F(CPWLComboBoxEditEmbedderTest, DeleteTextSelectionLeft) { FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable()); TypeTextIntoTextField(50); GetCPWLComboBox()->SetEditSelection(0, 5); EXPECT_STREQ(L"ABCDE", GetCPWLComboBox()->GetSelectedText().c_str()); GetCPWLComboBox()->ReplaceSelection(L""); EXPECT_STREQ(L"FGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqr", GetCPWLComboBox()->GetText().c_str()); } TEST_F(CPWLComboBoxEditEmbedderTest, DeleteTextSelectionRight) { FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable()); TypeTextIntoTextField(50); GetCPWLComboBox()->SetEditSelection(45, 50); EXPECT_STREQ(L"nopqr", GetCPWLComboBox()->GetSelectedText().c_str()); GetCPWLComboBox()->ReplaceSelection(L""); EXPECT_STREQ(L"ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklm", GetCPWLComboBox()->GetText().c_str()); } TEST_F(CPWLComboBoxEditEmbedderTest, DeleteEmptyTextSelection) { FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable()); TypeTextIntoTextField(50); GetCPWLComboBox()->ReplaceSelection(L""); EXPECT_STREQ(L"ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqr", GetCPWLComboBox()->GetText().c_str()); } TEST_F(CPWLComboBoxEditEmbedderTest, InsertTextInEmptyEditableComboBox) { FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable()); GetCPWLComboBox()->ReplaceSelection(L"Hello"); EXPECT_STREQ(L"Hello", GetCPWLComboBox()->GetText().c_str()); } TEST_F(CPWLComboBoxEditEmbedderTest, InsertTextInPopulatedEditableComboBoxLeft) { FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable()); TypeTextIntoTextField(10); // Move cursor to beginning of user-editable combobox text field. EXPECT_TRUE(GetCFFLFormField()->OnKeyDown(FWL_VKEY_Home, {})); GetCPWLComboBox()->ReplaceSelection(L"Hello"); EXPECT_STREQ(L"HelloABCDEFGHIJ", GetCPWLComboBox()->GetText().c_str()); } TEST_F(CPWLComboBoxEditEmbedderTest, InsertTextInPopulatedEditableComboBoxMiddle) { FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable()); TypeTextIntoTextField(10); // Move cursor to middle of user-editable combobox text field. for (int i = 0; i < 5; ++i) { EXPECT_TRUE(GetCFFLFormField()->OnKeyDown(FWL_VKEY_Left, {})); } GetCPWLComboBox()->ReplaceSelection(L"Hello"); EXPECT_STREQ(L"ABCDEHelloFGHIJ", GetCPWLComboBox()->GetText().c_str()); } TEST_F(CPWLComboBoxEditEmbedderTest, InsertTextInPopulatedEditableComboBoxRight) { FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable()); TypeTextIntoTextField(10); GetCPWLComboBox()->ReplaceSelection(L"Hello"); EXPECT_STREQ(L"ABCDEFGHIJHello", GetCPWLComboBox()->GetText().c_str()); } TEST_F(CPWLComboBoxEditEmbedderTest, InsertTextAndReplaceSelectionInPopulatedEditableComboBoxWhole) { FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable()); TypeTextIntoTextField(10); GetCPWLComboBox()->SetEditSelection(0, -1); EXPECT_STREQ(L"ABCDEFGHIJ", GetCPWLComboBox()->GetSelectedText().c_str()); GetCPWLComboBox()->ReplaceSelection(L"Hello"); EXPECT_STREQ(L"Hello", GetCPWLComboBox()->GetText().c_str()); } TEST_F(CPWLComboBoxEditEmbedderTest, InsertTextAndReplaceSelectionInPopulatedEditableComboBoxLeft) { FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable()); TypeTextIntoTextField(10); GetCPWLComboBox()->SetEditSelection(0, 5); EXPECT_STREQ(L"ABCDE", GetCPWLComboBox()->GetSelectedText().c_str()); GetCPWLComboBox()->ReplaceSelection(L"Hello"); EXPECT_STREQ(L"HelloFGHIJ", GetCPWLComboBox()->GetText().c_str()); } TEST_F(CPWLComboBoxEditEmbedderTest, InsertTextAndReplaceSelectionInPopulatedEditableComboBoxMiddle) { FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable()); TypeTextIntoTextField(10); GetCPWLComboBox()->SetEditSelection(2, 7); EXPECT_STREQ(L"CDEFG", GetCPWLComboBox()->GetSelectedText().c_str()); GetCPWLComboBox()->ReplaceSelection(L"Hello"); EXPECT_STREQ(L"ABHelloHIJ", GetCPWLComboBox()->GetText().c_str()); } TEST_F(CPWLComboBoxEditEmbedderTest, InsertTextAndReplaceSelectionInPopulatedEditableComboBoxRight) { FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable()); TypeTextIntoTextField(10); GetCPWLComboBox()->SetEditSelection(5, 10); EXPECT_STREQ(L"FGHIJ", GetCPWLComboBox()->GetSelectedText().c_str()); GetCPWLComboBox()->ReplaceSelection(L"Hello"); EXPECT_STREQ(L"ABCDEHello", GetCPWLComboBox()->GetText().c_str()); } TEST_F(CPWLComboBoxEditEmbedderTest, ReplaceAndKeepSelection) { FormFillerAndWindowSetup(GetCPDFSDKAnnotUserEditable()); TypeTextIntoTextField(10); GetCPWLComboBox()->SetEditSelection(1, 3); EXPECT_STREQ(L"ABCDEFGHIJ", GetCPWLComboBox()->GetText().c_str()); GetCPWLComboBox()->ReplaceAndKeepSelection(L"xyz"); EXPECT_STREQ(L"AxyzDEFGHIJ", GetCPWLComboBox()->GetText().c_str()); EXPECT_STREQ(L"xyz", GetCPWLComboBox()->GetSelectedText().c_str()); GetCPWLComboBox()->SetEditSelection(4, 1); GetCPWLComboBox()->ReplaceAndKeepSelection(L"12"); EXPECT_STREQ(L"A12DEFGHIJ", GetCPWLComboBox()->GetText().c_str()); EXPECT_STREQ(L"12", GetCPWLComboBox()->GetSelectedText().c_str()); }