]> git.saurik.com Git - wxWidgets.git/blobdiff - tests/controls/comboboxtest.cpp
Ensure that detached menus don't keep focus grab in wxGTK.
[wxWidgets.git] / tests / controls / comboboxtest.cpp
index 82678cc1e44f45b07229eb061130bc27a1e913fd..609c66b23222cd82d97339c2bed2e3307bddc668 100644 (file)
@@ -13,6 +13,8 @@
 
 #include "testprec.h"
 
 
 #include "testprec.h"
 
+#if wxUSE_COMBOBOX
+
 #ifdef __BORLANDC__
     #pragma hdrstop
 #endif
 #ifdef __BORLANDC__
     #pragma hdrstop
 #endif
 #endif // WX_PRECOMP
 
 #include "textentrytest.h"
 #endif // WX_PRECOMP
 
 #include "textentrytest.h"
+#include "itemcontainertest.h"
+#include "testableframe.h"
 
 // ----------------------------------------------------------------------------
 // test class
 // ----------------------------------------------------------------------------
 
 
 // ----------------------------------------------------------------------------
 // test class
 // ----------------------------------------------------------------------------
 
-class ComboBoxTestCase : public TextEntryTestCase
+class ComboBoxTestCase : public TextEntryTestCase, public ItemContainerTestCase,
+                         public CppUnit::TestCase
 {
 public:
     ComboBoxTestCase() { }
 {
 public:
     ComboBoxTestCase() { }
@@ -40,6 +45,9 @@ private:
     virtual wxTextEntry *GetTestEntry() const { return m_combo; }
     virtual wxWindow *GetTestWindow() const { return m_combo; }
 
     virtual wxTextEntry *GetTestEntry() const { return m_combo; }
     virtual wxWindow *GetTestWindow() const { return m_combo; }
 
+    virtual wxItemContainer *GetContainer() const { return m_combo; }
+    virtual wxWindow *GetContainerWindow() const { return m_combo; }
+
     virtual void CheckStringSelection(const char * WXUNUSED(sel))
     {
         // do nothing here, as explained in TextEntryTestCase comment, our
     virtual void CheckStringSelection(const char * WXUNUSED(sel))
     {
         // do nothing here, as explained in TextEntryTestCase comment, our
@@ -49,8 +57,20 @@ private:
 
     CPPUNIT_TEST_SUITE( ComboBoxTestCase );
         wxTEXT_ENTRY_TESTS();
 
     CPPUNIT_TEST_SUITE( ComboBoxTestCase );
         wxTEXT_ENTRY_TESTS();
+        wxITEM_CONTAINER_TESTS();
+        CPPUNIT_TEST( Size );
+        CPPUNIT_TEST( PopDismiss );
+        CPPUNIT_TEST( Sort );
+        CPPUNIT_TEST( ReadOnly );
+        CPPUNIT_TEST( IsEmpty );
     CPPUNIT_TEST_SUITE_END();
 
     CPPUNIT_TEST_SUITE_END();
 
+    void Size();
+    void PopDismiss();
+    void Sort();
+    void ReadOnly();
+    void IsEmpty();
+
     wxComboBox *m_combo;
 
     DECLARE_NO_COPY_CLASS(ComboBoxTestCase)
     wxComboBox *m_combo;
 
     DECLARE_NO_COPY_CLASS(ComboBoxTestCase)
@@ -59,7 +79,7 @@ private:
 // register in the unnamed registry so that these tests are run by default
 CPPUNIT_TEST_SUITE_REGISTRATION( ComboBoxTestCase );
 
 // register in the unnamed registry so that these tests are run by default
 CPPUNIT_TEST_SUITE_REGISTRATION( ComboBoxTestCase );
 
-// also include in it's own registry so that these tests can be run alone
+// also include in its own registry so that these tests can be run alone
 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( ComboBoxTestCase, "ComboBoxTestCase" );
 
 // ----------------------------------------------------------------------------
 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( ComboBoxTestCase, "ComboBoxTestCase" );
 
 // ----------------------------------------------------------------------------
@@ -81,3 +101,119 @@ void ComboBoxTestCase::tearDown()
 // tests themselves
 // ----------------------------------------------------------------------------
 
 // tests themselves
 // ----------------------------------------------------------------------------
 
+void ComboBoxTestCase::Size()
+{
+    // under MSW changing combobox size is a non-trivial operation because of
+    // confusion between the size of the control with and without dropdown, so
+    // check that it does work as expected
+
+    const int heightOrig = m_combo->GetSize().y;
+
+    // check that the height doesn't change if we don't touch it
+    m_combo->SetSize(100, -1);
+    CPPUNIT_ASSERT_EQUAL( heightOrig, m_combo->GetSize().y );
+
+    // check that setting both big and small (but not too small, there is a
+    // limit on how small the control can become under MSW) heights works
+    m_combo->SetSize(-1, 50);
+    CPPUNIT_ASSERT_EQUAL( 50, m_combo->GetSize().y );
+
+    m_combo->SetSize(-1, 10);
+    CPPUNIT_ASSERT_EQUAL( 10, m_combo->GetSize().y );
+
+    // and also that restoring it works (this used to be broken before 2.9.1)
+    m_combo->SetSize(-1, heightOrig);
+    CPPUNIT_ASSERT_EQUAL( heightOrig, m_combo->GetSize().y );
+}
+
+void ComboBoxTestCase::PopDismiss()
+{
+#if defined(__WXMSW__) || defined(__WXGTK210__)
+    EventCounter drop(m_combo, wxEVT_COMBOBOX_DROPDOWN);
+    EventCounter close(m_combo, wxEVT_COMBOBOX_CLOSEUP);
+
+    m_combo->Popup();
+    m_combo->Dismiss();
+
+    CPPUNIT_ASSERT_EQUAL(1, drop.GetCount());
+    CPPUNIT_ASSERT_EQUAL(1, close.GetCount());
+#endif
+}
+
+void ComboBoxTestCase::Sort()
+{
+#if !defined(__WXOSX__)
+    m_combo = new wxComboBox(wxTheApp->GetTopWindow(), wxID_ANY, "",
+                             wxDefaultPosition, wxDefaultSize, 0, NULL,
+                             wxCB_SORT);
+
+    m_combo->Append("aaa");
+    m_combo->Append("Aaa");
+    m_combo->Append("aba");
+    m_combo->Append("aaab");
+    m_combo->Append("aab");
+    m_combo->Append("AAA");
+
+    CPPUNIT_ASSERT_EQUAL("AAA", m_combo->GetString(0));
+    CPPUNIT_ASSERT_EQUAL("Aaa", m_combo->GetString(1));
+    CPPUNIT_ASSERT_EQUAL("aaa", m_combo->GetString(2));
+    CPPUNIT_ASSERT_EQUAL("aaab", m_combo->GetString(3));
+    CPPUNIT_ASSERT_EQUAL("aab", m_combo->GetString(4));
+    CPPUNIT_ASSERT_EQUAL("aba", m_combo->GetString(5));
+
+    m_combo->Append("a");
+
+    CPPUNIT_ASSERT_EQUAL("a", m_combo->GetString(0));
+#endif
+}
+
+void ComboBoxTestCase::ReadOnly()
+{
+#ifndef __WXOSX__
+    wxArrayString testitems;
+    testitems.Add("item 1");
+    testitems.Add("item 2");
+
+    m_combo = new wxComboBox(wxTheApp->GetTopWindow(), wxID_ANY, "",
+                             wxDefaultPosition, wxDefaultSize, testitems,
+                             wxCB_READONLY);
+
+    m_combo->SetValue("item 1");
+
+    CPPUNIT_ASSERT_EQUAL("item 1", m_combo->GetValue());
+
+    m_combo->SetValue("not an item");
+
+    CPPUNIT_ASSERT_EQUAL("item 1", m_combo->GetValue());
+
+    // Since this uses FindString it is case insensitive
+    m_combo->SetValue("ITEM 2");
+
+    CPPUNIT_ASSERT_EQUAL("item 2", m_combo->GetValue());
+#endif
+}
+
+void ComboBoxTestCase::IsEmpty()
+{
+    CPPUNIT_ASSERT( m_combo->IsListEmpty() );
+    CPPUNIT_ASSERT( m_combo->IsTextEmpty() );
+
+    m_combo->Append("foo");
+    CPPUNIT_ASSERT( !m_combo->IsListEmpty() );
+    CPPUNIT_ASSERT( m_combo->IsTextEmpty() );
+
+    m_combo->SetValue("bar");
+    CPPUNIT_ASSERT( !m_combo->IsListEmpty() );
+    CPPUNIT_ASSERT( !m_combo->IsTextEmpty() );
+
+    m_combo->Clear();
+    CPPUNIT_ASSERT( m_combo->IsListEmpty() );
+    CPPUNIT_ASSERT( m_combo->IsTextEmpty() );
+
+#ifdef TEST_INVALID_COMBOBOX_ISEMPTY
+    // Compiling this should fail, see failtest target definition in test.bkl.
+    m_combo->IsEmpty();
+#endif
+}
+
+#endif //wxUSE_COMBOBOX