| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378 | 
							- ///////////////////////////////////////////////////////////////////////////////
 
- // Name:        tests/sizers/boxsizer.cpp
 
- // Purpose:     Unit tests for wxBoxSizer
 
- // Author:      Vadim Zeitlin
 
- // Created:     2010-03-06
 
- // Copyright:   (c) 2010 Vadim Zeitlin <vadim@wxwidgets.org>
 
- ///////////////////////////////////////////////////////////////////////////////
 
- // ----------------------------------------------------------------------------
 
- // headers
 
- // ----------------------------------------------------------------------------
 
- #include "testprec.h"
 
- #ifdef __BORLANDC__
 
-     #pragma hdrstop
 
- #endif
 
- #ifndef WX_PRECOMP
 
-     #include "wx/app.h"
 
-     #include "wx/sizer.h"
 
-     #include "wx/listbox.h"
 
- #endif // WX_PRECOMP
 
- #include "asserthelper.h"
 
- // ----------------------------------------------------------------------------
 
- // test class
 
- // ----------------------------------------------------------------------------
 
- class BoxSizerTestCase : public CppUnit::TestCase
 
- {
 
- public:
 
-     BoxSizerTestCase() { }
 
-     virtual void setUp();
 
-     virtual void tearDown();
 
- private:
 
-     CPPUNIT_TEST_SUITE( BoxSizerTestCase );
 
-         CPPUNIT_TEST( Size1 );
 
-         CPPUNIT_TEST( Size3 );
 
-         CPPUNIT_TEST( CalcMin );
 
-         CPPUNIT_TEST( BestSizeRespectsMaxSize );
 
-         CPPUNIT_TEST( RecalcSizesRespectsMaxSize1 );
 
-         CPPUNIT_TEST( RecalcSizesRespectsMaxSize2 );
 
-     CPPUNIT_TEST_SUITE_END();
 
-     void Size1();
 
-     void Size3();
 
-     void CalcMin();
 
-     void BestSizeRespectsMaxSize();
 
-     void RecalcSizesRespectsMaxSize1();
 
-     void RecalcSizesRespectsMaxSize2();
 
-     wxWindow *m_win;
 
-     wxSizer *m_sizer;
 
-     DECLARE_NO_COPY_CLASS(BoxSizerTestCase)
 
- };
 
- // register in the unnamed registry so that these tests are run by default
 
- CPPUNIT_TEST_SUITE_REGISTRATION( BoxSizerTestCase );
 
- // also include in its own registry so that these tests can be run alone
 
- CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( BoxSizerTestCase, "BoxSizerTestCase" );
 
- // ----------------------------------------------------------------------------
 
- // test initialization
 
- // ----------------------------------------------------------------------------
 
- void BoxSizerTestCase::setUp()
 
- {
 
-     m_win = new wxWindow(wxTheApp->GetTopWindow(), wxID_ANY);
 
-     m_win->SetClientSize(127, 35);
 
-     m_sizer = new wxBoxSizer(wxHORIZONTAL);
 
-     m_win->SetSizer(m_sizer);
 
- }
 
- void BoxSizerTestCase::tearDown()
 
- {
 
-     delete m_win;
 
-     m_win = NULL;
 
-     m_sizer = NULL;
 
- }
 
- // ----------------------------------------------------------------------------
 
- // tests themselves
 
- // ----------------------------------------------------------------------------
 
- void BoxSizerTestCase::Size1()
 
- {
 
-     const wxSize sizeTotal = m_win->GetClientSize();
 
-     const wxSize sizeChild = sizeTotal / 2;
 
-     wxWindow * const
 
-         child = new wxWindow(m_win, wxID_ANY, wxDefaultPosition, sizeChild);
 
-     m_sizer->Add(child);
 
-     m_win->Layout();
 
-     CPPUNIT_ASSERT_EQUAL( sizeChild, child->GetSize() );
 
-     m_sizer->Clear();
 
-     m_sizer->Add(child, wxSizerFlags(1));
 
-     m_win->Layout();
 
-     CPPUNIT_ASSERT_EQUAL( wxSize(sizeTotal.x, sizeChild.y), child->GetSize() );
 
-     m_sizer->Clear();
 
-     m_sizer->Add(child, wxSizerFlags(1).Expand());
 
-     m_win->Layout();
 
-     CPPUNIT_ASSERT_EQUAL( sizeTotal, child->GetSize() );
 
-     m_sizer->Clear();
 
-     m_sizer->Add(child, wxSizerFlags());
 
-     m_sizer->SetItemMinSize(child, sizeTotal*2);
 
-     m_win->Layout();
 
-     CPPUNIT_ASSERT_EQUAL( sizeTotal, child->GetSize() );
 
-     m_sizer->Clear();
 
-     m_sizer->Add(child, wxSizerFlags().Expand());
 
-     m_sizer->SetItemMinSize(child, sizeTotal*2);
 
-     m_win->Layout();
 
-     CPPUNIT_ASSERT_EQUAL( sizeTotal, child->GetSize() );
 
- }
 
- void BoxSizerTestCase::Size3()
 
- {
 
-     // check that various combinations of minimal sizes and proportions work as
 
-     // expected for different window sizes
 
-     static const struct LayoutTestData
 
-     {
 
-         // proportions of the elements
 
-         int prop[3];
 
-         // minimal sizes of the elements in the sizer direction
 
-         int minsize[3];
 
-         // total size and the expected sizes of the elements
 
-         int x,
 
-             sizes[3];
 
-         // if true, don't try the permutations of our test data
 
-         bool dontPermute;
 
-         // Add the given window to the sizer with the corresponding parameters
 
-         void AddToSizer(wxSizer *sizer, wxWindow *win, int n) const
 
-         {
 
-             sizer->Add(win, wxSizerFlags(prop[n]));
 
-             sizer->SetItemMinSize(win, wxSize(minsize[n], -1));
 
-         }
 
-     } layoutTestData[] =
 
-     {
 
-         // some really simple cases (no need to permute those, they're
 
-         // symmetrical anyhow)
 
-         { { 1, 1, 1, }, {  50,  50,  50, }, 150, {  50,  50,  50, }, true },
 
-         { { 2, 2, 2, }, {  50,  50,  50, }, 600, { 200, 200, 200, }, true },
 
-         // items with different proportions and min sizes when there is enough
 
-         // space to lay them out
 
-         { { 1, 2, 3, }, {   0,   0,   0, }, 600, { 100, 200, 300, } },
 
-         { { 1, 2, 3, }, { 100, 100, 100, }, 600, { 100, 200, 300, } },
 
-         { { 1, 2, 3, }, { 100,  50,  50, }, 600, { 100, 200, 300, } },
 
-         { { 0, 1, 1, }, { 200, 100, 100, }, 600, { 200, 200, 200, } },
 
-         { { 0, 1, 2, }, { 300, 100, 100, }, 600, { 300, 100, 200, } },
 
-         { { 0, 1, 1, }, { 100,  50,  50, }, 300, { 100, 100, 100, } },
 
-         { { 0, 1, 2, }, { 100,  50,  50, }, 400, { 100, 100, 200, } },
 
-         // cases when there is not enough space to lay out the items correctly
 
-         // while still respecting their min sizes
 
-         { { 0, 1, 1, }, { 100, 150,  50, }, 300, { 100, 150,  50, } },
 
-         { { 1, 2, 3, }, { 100, 100, 100, }, 300, { 100, 100, 100, } },
 
-         { { 1, 2, 3, }, { 100,  50,  50, }, 300, { 100,  80, 120, } },
 
-         { { 1, 2, 3, }, { 100,  10,  10, }, 150, { 100,  20,  30, } },
 
-         // cases when there is not enough space even for the min sizes (don't
 
-         // permute in these cases as the layout does depend on the item order
 
-         // because the first ones have priority)
 
-         { { 1, 2, 3, }, { 100,  50,  50, }, 150, { 100,  50,   0, }, true },
 
-         { { 1, 2, 3, }, { 100, 100, 100, }, 200, { 100, 100,   0, }, true },
 
-         { { 1, 2, 3, }, { 100, 100, 100, }, 150, { 100,  50,   0, }, true },
 
-         { { 1, 2, 3, }, { 100, 100, 100, },  50, {  50,   0,   0, }, true },
 
-         { { 1, 2, 3, }, { 100, 100, 100, },   0, {   0,   0,   0, }, true },
 
-     };
 
-     wxWindow *child[3];
 
-     child[0] = new wxWindow(m_win, wxID_ANY);
 
-     child[1] = new wxWindow(m_win, wxID_ANY);
 
-     child[2] = new wxWindow(m_win, wxID_ANY);
 
-     for ( unsigned i = 0; i < WXSIZEOF(layoutTestData); i++ )
 
-     {
 
-         LayoutTestData ltd = layoutTestData[i];
 
-         // the results shouldn't depend on the order of items except in the
 
-         // case when there is not enough space for even the fixed width items
 
-         // (in which case the first ones might get enough of it but not the
 
-         // last ones) so test a couple of permutations of test data unless
 
-         // specifically disabled for this test case
 
-         for ( unsigned p = 0; p < 3; p++)
 
-         {
 
-             switch ( p )
 
-             {
 
-                 case 0:
 
-                     // nothing to do, use original data
 
-                     break;
 
-                 case 1:
 
-                     // exchange first and last elements
 
-                     wxSwap(ltd.prop[0], ltd.prop[2]);
 
-                     wxSwap(ltd.minsize[0], ltd.minsize[2]);
 
-                     wxSwap(ltd.sizes[0], ltd.sizes[2]);
 
-                     break;
 
-                 case 2:
 
-                     // exchange the original third and second elements
 
-                     wxSwap(ltd.prop[0], ltd.prop[1]);
 
-                     wxSwap(ltd.minsize[0], ltd.minsize[1]);
 
-                     wxSwap(ltd.sizes[0], ltd.sizes[1]);
 
-                     break;
 
-             }
 
-             m_sizer->Clear();
 
-             unsigned j;
 
-             for ( j = 0; j < WXSIZEOF(child); j++ )
 
-                 ltd.AddToSizer(m_sizer, child[j], j);
 
-             m_win->SetClientSize(ltd.x, -1);
 
-             m_win->Layout();
 
-             for ( j = 0; j < WXSIZEOF(child); j++ )
 
-             {
 
-                 WX_ASSERT_EQUAL_MESSAGE
 
-                 (
 
-                     (
 
-                         "test %lu, permutation #%lu: wrong size for child #%d "
 
-                         "for total size %d",
 
-                         static_cast<unsigned long>(i),
 
-                         static_cast<unsigned long>(p),
 
-                         j,
 
-                         ltd.x
 
-                     ),
 
-                     ltd.sizes[j], child[j]->GetSize().x
 
-                 );
 
-             }
 
-             // don't try other permutations if explicitly disabled
 
-             if ( ltd.dontPermute )
 
-                 break;
 
-         }
 
-     }
 
- }
 
- void BoxSizerTestCase::CalcMin()
 
- {
 
-     static const unsigned NUM_TEST_ITEM = 3;
 
-     static const struct CalcMinTestData
 
-     {
 
-         // proportions of the elements, if one of them is -1 it means to not
 
-         // use this window at all in this test
 
-         int prop[NUM_TEST_ITEM];
 
-         // minimal sizes of the elements in the sizer direction
 
-         int minsize[NUM_TEST_ITEM];
 
-         // the expected minimal sizer size
 
-         int total;
 
-     } calcMinTestData[] =
 
-     {
 
-         { {  1,  1, -1 }, {  30,  50,   0 },  100 },
 
-         { {  1,  1,  0 }, {  30,  50,  20 },  120 },
 
-         { { 10, 10, -1 }, {  30,  50,   0 },  100 },
 
-         { {  1,  2,  2 }, {  50,  50,  80 },  250 },
 
-         { {  1,  2,  2 }, { 100,  50,  80 },  500 },
 
-     };
 
-     unsigned n;
 
-     wxWindow *child[NUM_TEST_ITEM];
 
-     for ( n = 0; n < NUM_TEST_ITEM; n++ )
 
-         child[n] = new wxWindow(m_win, wxID_ANY);
 
-     for ( unsigned i = 0; i < WXSIZEOF(calcMinTestData); i++ )
 
-     {
 
-         m_sizer->Clear();
 
-         const CalcMinTestData& cmtd = calcMinTestData[i];
 
-         for ( n = 0; n < NUM_TEST_ITEM; n++ )
 
-         {
 
-             if ( cmtd.prop[n] != -1 )
 
-             {
 
-                 child[n]->SetInitialSize(wxSize(cmtd.minsize[n], -1));
 
-                 m_sizer->Add(child[n], wxSizerFlags(cmtd.prop[n]));
 
-             }
 
-         }
 
-         WX_ASSERT_EQUAL_MESSAGE
 
-         (
 
-             ("In test #%u", i),
 
-             cmtd.total, m_sizer->CalcMin().x
 
-         );
 
-     }
 
- }
 
- void BoxSizerTestCase::BestSizeRespectsMaxSize()
 
- {
 
-     m_sizer->Clear();
 
-     const int maxWidth = 100;
 
-     wxSizer* sizer = new wxBoxSizer(wxVERTICAL);
 
-     wxListBox* listbox = new wxListBox(m_win, wxID_ANY);
 
-     listbox->Append("some very very very very very very very very very very very long string");
 
-     listbox->SetMaxSize(wxSize(maxWidth, -1));
 
-     sizer->Add(listbox);
 
-     m_sizer->Add(sizer);
 
-     m_win->Layout();
 
-     CPPUNIT_ASSERT_EQUAL(maxWidth, listbox->GetSize().GetWidth());
 
- }
 
- void BoxSizerTestCase::RecalcSizesRespectsMaxSize1()
 
- {
 
-     m_sizer->Clear();
 
-     const int maxWidth = 100;
 
-     m_win->SetClientSize(300, 300);
 
-     wxSizer* sizer1 = new wxBoxSizer(wxVERTICAL);
 
-     m_sizer->Add(sizer1);
 
-     wxListBox* listbox1 = new wxListBox(m_win, wxID_ANY);
 
-     listbox1->Append("some very very very very very very very very very very very long string");
 
-     sizer1->Add(listbox1);
 
-     wxSizer* sizer2 = new wxBoxSizer(wxHORIZONTAL);
 
-     sizer1->Add(sizer2, wxSizerFlags().Expand());
 
-     wxListBox* listbox2 = new wxListBox(m_win, wxID_ANY);
 
-     listbox2->Append("some string");
 
-     listbox2->SetMaxSize(wxSize(100, -1));
 
-     sizer2->Add(listbox2, wxSizerFlags().Proportion(1));
 
-     m_win->Layout();
 
-     CPPUNIT_ASSERT_EQUAL(maxWidth, listbox2->GetSize().GetWidth());
 
- }
 
- void BoxSizerTestCase::RecalcSizesRespectsMaxSize2()
 
- {
 
-     m_sizer->Clear();
 
-     m_win->SetClientSize(300, 300);
 
-     wxSizer* sizer1 = new wxBoxSizer(wxVERTICAL);
 
-     m_sizer->Add(sizer1, wxSizerFlags().Expand());
 
-     wxWindow* child1 = new wxWindow(m_win, wxID_ANY);
 
-     sizer1->Add(child1, wxSizerFlags().Proportion(1));
 
-     wxWindow* child2 = new wxWindow(m_win, wxID_ANY);
 
-     child2->SetMaxSize(wxSize(-1, 50));
 
-     sizer1->Add(child2, wxSizerFlags().Proportion(1));
 
-     wxWindow* child3 = new wxWindow(m_win, wxID_ANY);
 
-     sizer1->Add(child3, wxSizerFlags().Proportion(1));
 
-     m_win->Layout();
 
-     CPPUNIT_ASSERT_EQUAL(125, child1->GetSize().GetHeight());
 
-     CPPUNIT_ASSERT_EQUAL(50, child2->GetSize().GetHeight());
 
-     CPPUNIT_ASSERT_EQUAL(125, child3->GetSize().GetHeight());
 
- }
 
 
  |