throw away the now invalid items in wxSelectionStore::SetItemCount() (bug 1929823) and added a unit test for this class

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@52939 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2008-03-31 15:22:10 +00:00
parent d497bc6561
commit c8f80d2758
12 changed files with 187 additions and 7 deletions

View File

@@ -43,7 +43,7 @@ public:
wxSelectionStore() : m_itemsSel(wxUIntCmp) { Init(); } wxSelectionStore() : m_itemsSel(wxUIntCmp) { Init(); }
// set the total number of items we handle // set the total number of items we handle
void SetItemCount(unsigned count) { m_count = count; } void SetItemCount(unsigned count);
// special case of SetItemCount(0) // special case of SetItemCount(0)
void Clear() { m_itemsSel.Clear(); m_count = 0; m_defaultState = false; } void Clear() { m_itemsSel.Clear(); m_count = 0; m_defaultState = false; }
@@ -59,7 +59,7 @@ public:
// returns true if the items selection really changed // returns true if the items selection really changed
bool SelectItem(unsigned item, bool select = true); bool SelectItem(unsigned item, bool select = true);
// select the range of items // select the range of items (inclusive)
// //
// return true and fill the itemsChanged array with the indices of items // return true and fill the itemsChanged array with the indices of items
// which have changed state if "few" of them did, otherwise return false // which have changed state if "few" of them did, otherwise return false

View File

@@ -214,3 +214,19 @@ void wxSelectionStore::OnItemDelete(unsigned item)
} }
} }
void wxSelectionStore::SetItemCount(unsigned count)
{
// forget about all items whose indices are now invalid if the size
// decreased
if ( count < m_count )
{
for ( size_t i = m_itemsSel.GetCount(); i > 0; i-- )
{
if ( m_itemsSel[i - 1] >= count )
m_itemsSel.RemoveAt(i - 1);
}
}
// remember the new number of items
m_count = count;
}

View File

@@ -116,7 +116,8 @@ TEST_GUI_OBJECTS = \
test_gui_point.o \ test_gui_point.o \
test_gui_config.o \ test_gui_config.o \
test_gui_clientsize.o \ test_gui_clientsize.o \
test_gui_textctrltest.o test_gui_textctrltest.o \
test_gui_selstoretest.o
TEST_GUI_ODEP = $(___pch_testprec_test_gui_testprec_h_gch___depname) TEST_GUI_ODEP = $(___pch_testprec_test_gui_testprec_h_gch___depname)
PRINTFBENCH_CXXFLAGS = $(__printfbench_PCH_INC) -D__WX$(TOOLKIT)__ \ PRINTFBENCH_CXXFLAGS = $(__printfbench_PCH_INC) -D__WX$(TOOLKIT)__ \
$(__WXUNIV_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \ $(__WXUNIV_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \
@@ -502,6 +503,9 @@ test_gui_clientsize.o: $(srcdir)/controls/clientsize.cpp $(TEST_GUI_ODEP)
test_gui_textctrltest.o: $(srcdir)/controls/textctrltest.cpp $(TEST_GUI_ODEP) test_gui_textctrltest.o: $(srcdir)/controls/textctrltest.cpp $(TEST_GUI_ODEP)
$(CXXC) -c -o $@ $(TEST_GUI_CXXFLAGS) $(srcdir)/controls/textctrltest.cpp $(CXXC) -c -o $@ $(TEST_GUI_CXXFLAGS) $(srcdir)/controls/textctrltest.cpp
test_gui_selstoretest.o: $(srcdir)/misc/selstoretest.cpp $(TEST_GUI_ODEP)
$(CXXC) -c -o $@ $(TEST_GUI_CXXFLAGS) $(srcdir)/misc/selstoretest.cpp
printfbench_printfbench.o: $(srcdir)/benchmarks/printfbench.cpp $(PRINTFBENCH_ODEP) printfbench_printfbench.o: $(srcdir)/benchmarks/printfbench.cpp $(PRINTFBENCH_ODEP)
$(CXXC) -c -o $@ $(PRINTFBENCH_CXXFLAGS) $(srcdir)/benchmarks/printfbench.cpp $(CXXC) -c -o $@ $(PRINTFBENCH_CXXFLAGS) $(srcdir)/benchmarks/printfbench.cpp

View File

@@ -103,7 +103,8 @@ TEST_GUI_OBJECTS = \
$(OBJS)\test_gui_point.obj \ $(OBJS)\test_gui_point.obj \
$(OBJS)\test_gui_config.obj \ $(OBJS)\test_gui_config.obj \
$(OBJS)\test_gui_clientsize.obj \ $(OBJS)\test_gui_clientsize.obj \
$(OBJS)\test_gui_textctrltest.obj $(OBJS)\test_gui_textctrltest.obj \
$(OBJS)\test_gui_selstoretest.obj
PRINTFBENCH_CXXFLAGS = $(__RUNTIME_LIBS) -I$(BCCDIR)\include $(__DEBUGINFO) \ PRINTFBENCH_CXXFLAGS = $(__RUNTIME_LIBS) -I$(BCCDIR)\include $(__DEBUGINFO) \
$(__OPTIMIZEFLAG) $(__THREADSFLAG_1) -D__WXMSW__ $(__WXUNIV_DEFINE_p) \ $(__OPTIMIZEFLAG) $(__THREADSFLAG_1) -D__WXMSW__ $(__WXUNIV_DEFINE_p) \
$(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \ $(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \
@@ -537,6 +538,9 @@ $(OBJS)\test_gui_clientsize.obj: .\controls\clientsize.cpp
$(OBJS)\test_gui_textctrltest.obj: .\controls\textctrltest.cpp $(OBJS)\test_gui_textctrltest.obj: .\controls\textctrltest.cpp
$(CXX) -q -c -P -o$@ $(TEST_GUI_CXXFLAGS) .\controls\textctrltest.cpp $(CXX) -q -c -P -o$@ $(TEST_GUI_CXXFLAGS) .\controls\textctrltest.cpp
$(OBJS)\test_gui_selstoretest.obj: .\misc\selstoretest.cpp
$(CXX) -q -c -P -o$@ $(TEST_GUI_CXXFLAGS) .\misc\selstoretest.cpp
$(OBJS)\printfbench_dummy.obj: .\dummy.cpp $(OBJS)\printfbench_dummy.obj: .\dummy.cpp
$(CXX) -q -c -P -o$@ $(PRINTFBENCH_CXXFLAGS) -H .\dummy.cpp $(CXX) -q -c -P -o$@ $(PRINTFBENCH_CXXFLAGS) -H .\dummy.cpp

View File

@@ -96,7 +96,8 @@ TEST_GUI_OBJECTS = \
$(OBJS)\test_gui_point.o \ $(OBJS)\test_gui_point.o \
$(OBJS)\test_gui_config.o \ $(OBJS)\test_gui_config.o \
$(OBJS)\test_gui_clientsize.o \ $(OBJS)\test_gui_clientsize.o \
$(OBJS)\test_gui_textctrltest.o $(OBJS)\test_gui_textctrltest.o \
$(OBJS)\test_gui_selstoretest.o
PRINTFBENCH_CXXFLAGS = $(__DEBUGINFO) $(__OPTIMIZEFLAG) $(__THREADSFLAG) \ PRINTFBENCH_CXXFLAGS = $(__DEBUGINFO) $(__OPTIMIZEFLAG) $(__THREADSFLAG) \
$(GCCFLAGS) -DHAVE_W32API_H -D__WXMSW__ $(__WXUNIV_DEFINE_p) \ $(GCCFLAGS) -DHAVE_W32API_H -D__WXMSW__ $(__WXUNIV_DEFINE_p) \
$(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \ $(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \
@@ -515,6 +516,9 @@ $(OBJS)\test_gui_clientsize.o: ./controls/clientsize.cpp
$(OBJS)\test_gui_textctrltest.o: ./controls/textctrltest.cpp $(OBJS)\test_gui_textctrltest.o: ./controls/textctrltest.cpp
$(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $< $(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $<
$(OBJS)\test_gui_selstoretest.o: ./misc/selstoretest.cpp
$(CXX) -c -o $@ $(TEST_GUI_CXXFLAGS) $(CPPDEPS) $<
$(OBJS)\printfbench_dummy.o: ./dummy.cpp $(OBJS)\printfbench_dummy.o: ./dummy.cpp
$(CXX) -c -o $@ $(PRINTFBENCH_CXXFLAGS) $(CPPDEPS) $< $(CXX) -c -o $@ $(PRINTFBENCH_CXXFLAGS) $(CPPDEPS) $<

View File

@@ -99,7 +99,8 @@ TEST_GUI_OBJECTS = \
$(OBJS)\test_gui_point.obj \ $(OBJS)\test_gui_point.obj \
$(OBJS)\test_gui_config.obj \ $(OBJS)\test_gui_config.obj \
$(OBJS)\test_gui_clientsize.obj \ $(OBJS)\test_gui_clientsize.obj \
$(OBJS)\test_gui_textctrltest.obj $(OBJS)\test_gui_textctrltest.obj \
$(OBJS)\test_gui_selstoretest.obj
PRINTFBENCH_CXXFLAGS = /M$(__RUNTIME_LIBS_38)$(__DEBUGRUNTIME) /DWIN32 \ PRINTFBENCH_CXXFLAGS = /M$(__RUNTIME_LIBS_38)$(__DEBUGRUNTIME) /DWIN32 \
$(__DEBUGINFO) /Fd$(OBJS)\printfbench.pdb $(____DEBUGRUNTIME) \ $(__DEBUGINFO) /Fd$(OBJS)\printfbench.pdb $(____DEBUGRUNTIME) \
$(__OPTIMIZEFLAG) $(__NO_VC_CRTDBG_p) /D__WXMSW__ $(__WXUNIV_DEFINE_p) \ $(__OPTIMIZEFLAG) $(__NO_VC_CRTDBG_p) /D__WXMSW__ $(__WXUNIV_DEFINE_p) \
@@ -622,6 +623,9 @@ $(OBJS)\test_gui_clientsize.obj: .\controls\clientsize.cpp
$(OBJS)\test_gui_textctrltest.obj: .\controls\textctrltest.cpp $(OBJS)\test_gui_textctrltest.obj: .\controls\textctrltest.cpp
$(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) .\controls\textctrltest.cpp $(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) .\controls\textctrltest.cpp
$(OBJS)\test_gui_selstoretest.obj: .\misc\selstoretest.cpp
$(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) .\misc\selstoretest.cpp
$(OBJS)\printfbench_dummy.obj: .\dummy.cpp $(OBJS)\printfbench_dummy.obj: .\dummy.cpp
$(CXX) /c /nologo /TP /Fo$@ $(PRINTFBENCH_CXXFLAGS) /Yctestprec.h .\dummy.cpp $(CXX) /c /nologo /TP /Fo$@ $(PRINTFBENCH_CXXFLAGS) /Yctestprec.h .\dummy.cpp

View File

@@ -308,7 +308,8 @@ TEST_GUI_OBJECTS = &
$(OBJS)\test_gui_point.obj & $(OBJS)\test_gui_point.obj &
$(OBJS)\test_gui_config.obj & $(OBJS)\test_gui_config.obj &
$(OBJS)\test_gui_clientsize.obj & $(OBJS)\test_gui_clientsize.obj &
$(OBJS)\test_gui_textctrltest.obj $(OBJS)\test_gui_textctrltest.obj &
$(OBJS)\test_gui_selstoretest.obj
PRINTFBENCH_CXXFLAGS = $(__DEBUGINFO) $(__OPTIMIZEFLAG) $(__THREADSFLAG) & PRINTFBENCH_CXXFLAGS = $(__DEBUGINFO) $(__OPTIMIZEFLAG) $(__THREADSFLAG) &
$(__RUNTIME_LIBS) -d__WXMSW__ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) & $(__RUNTIME_LIBS) -d__WXMSW__ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) &
$(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) & $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) &
@@ -568,6 +569,9 @@ $(OBJS)\test_gui_clientsize.obj : .AUTODEPEND .\controls\clientsize.cpp
$(OBJS)\test_gui_textctrltest.obj : .AUTODEPEND .\controls\textctrltest.cpp $(OBJS)\test_gui_textctrltest.obj : .AUTODEPEND .\controls\textctrltest.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(TEST_GUI_CXXFLAGS) $< $(CXX) -bt=nt -zq -fo=$^@ $(TEST_GUI_CXXFLAGS) $<
$(OBJS)\test_gui_selstoretest.obj : .AUTODEPEND .\misc\selstoretest.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(TEST_GUI_CXXFLAGS) $<
$(OBJS)\printfbench_dummy.obj : .AUTODEPEND .\dummy.cpp $(OBJS)\printfbench_dummy.obj : .AUTODEPEND .\dummy.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(PRINTFBENCH_CXXFLAGS) $< $(CXX) -bt=nt -zq -fo=$^@ $(PRINTFBENCH_CXXFLAGS) $<

134
tests/misc/selstoretest.cpp Normal file
View File

@@ -0,0 +1,134 @@
///////////////////////////////////////////////////////////////////////////////
// Name: tests/misc/selstoretest.cpp
// Purpose: wxSelectionStore unit test
// Author: Vadim Zeitlin
// Created: 2008-03-31
// RCS-ID: $Id$
// Copyright: (c) 2008 Vadim Zeitlin
///////////////////////////////////////////////////////////////////////////////
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
#include "testprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/selstore.h"
// ----------------------------------------------------------------------------
// test class
// ----------------------------------------------------------------------------
class SelStoreTestCase : public CppUnit::TestCase
{
public:
SelStoreTestCase() { m_store = NULL; }
virtual void setUp()
{
m_store = new wxSelectionStore;
m_store->SetItemCount(NUM_ITEMS);
}
virtual void tearDown()
{
delete m_store;
m_store = NULL;
}
private:
CPPUNIT_TEST_SUITE( SelStoreTestCase );
CPPUNIT_TEST( SelectItem );
CPPUNIT_TEST( SelectRange );
CPPUNIT_TEST( SetItemCount );
CPPUNIT_TEST( Clear );
CPPUNIT_TEST_SUITE_END();
void SelectItem();
void SelectRange();
void SetItemCount();
void Clear();
// NB: must be even
static const unsigned NUM_ITEMS;
wxSelectionStore *m_store;
DECLARE_NO_COPY_CLASS(SelStoreTestCase)
};
// register in the unnamed registry so that these tests are run by default
CPPUNIT_TEST_SUITE_REGISTRATION( SelStoreTestCase );
// also include in it's own registry so that these tests can be run alone
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( SelStoreTestCase, "SelStoreTestCase" );
const unsigned SelStoreTestCase::NUM_ITEMS = 10; // NB: must be even
void SelStoreTestCase::SelectItem()
{
m_store->SelectItem(0);
CPPUNIT_ASSERT_EQUAL( 1u, m_store->GetSelectedCount() );
CPPUNIT_ASSERT( m_store->IsSelected(0) );
m_store->SelectItem(NUM_ITEMS - 1);
CPPUNIT_ASSERT_EQUAL( 2u, m_store->GetSelectedCount() );
CPPUNIT_ASSERT( m_store->IsSelected(NUM_ITEMS - 1) );
m_store->SelectItem(0, false);
CPPUNIT_ASSERT_EQUAL( 1u, m_store->GetSelectedCount() );
CPPUNIT_ASSERT( !m_store->IsSelected(0) );
}
void SelStoreTestCase::SelectRange()
{
m_store->SelectRange(0, NUM_ITEMS/2);
CPPUNIT_ASSERT_EQUAL( NUM_ITEMS/2 + 1, m_store->GetSelectedCount() );
CPPUNIT_ASSERT( m_store->IsSelected(0) );
CPPUNIT_ASSERT( !m_store->IsSelected(NUM_ITEMS - 1) );
m_store->SelectRange(NUM_ITEMS/2, NUM_ITEMS - 1);
CPPUNIT_ASSERT_EQUAL( NUM_ITEMS, m_store->GetSelectedCount() );
CPPUNIT_ASSERT( m_store->IsSelected(0) );
CPPUNIT_ASSERT( m_store->IsSelected(NUM_ITEMS - 1) );
m_store->SelectRange(1, NUM_ITEMS - 2, false);
CPPUNIT_ASSERT_EQUAL( 2u, m_store->GetSelectedCount() );
CPPUNIT_ASSERT( m_store->IsSelected(0) );
CPPUNIT_ASSERT( !m_store->IsSelected(NUM_ITEMS/2) );
CPPUNIT_ASSERT( m_store->IsSelected(NUM_ITEMS - 1) );
}
void SelStoreTestCase::SetItemCount()
{
m_store->SelectRange(1, NUM_ITEMS - 2);
CPPUNIT_ASSERT_EQUAL( NUM_ITEMS - 2, m_store->GetSelectedCount() );
m_store->SetItemCount(NUM_ITEMS/2);
CPPUNIT_ASSERT_EQUAL( NUM_ITEMS/2 - 1, m_store->GetSelectedCount() );
m_store->Clear();
m_store->SetItemCount(NUM_ITEMS);
m_store->SelectItem(NUM_ITEMS/2 - 1);
m_store->SelectItem(NUM_ITEMS/2 + 1);
m_store->SetItemCount(NUM_ITEMS/2);
CPPUNIT_ASSERT_EQUAL( 1u, m_store->GetSelectedCount() );
}
void SelStoreTestCase::Clear()
{
CPPUNIT_ASSERT_EQUAL( 0u, m_store->GetSelectedCount() );
m_store->SelectItem(0);
m_store->Clear();
CPPUNIT_ASSERT_EQUAL( 0u, m_store->GetSelectedCount() );
}

View File

@@ -96,6 +96,7 @@
config/config.cpp config/config.cpp
controls/clientsize.cpp controls/clientsize.cpp
controls/textctrltest.cpp controls/textctrltest.cpp
misc/selstoretest.cpp
</sources> </sources>
<wx-lib>core</wx-lib> <wx-lib>core</wx-lib>
<wx-lib>base</wx-lib> <wx-lib>base</wx-lib>

View File

@@ -261,6 +261,10 @@ SOURCE=.\..\samples\sample.rc
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\misc\selstoretest.cpp
# End Source File
# Begin Source File
SOURCE=.\geometry\size.cpp SOURCE=.\geometry\size.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File

View File

@@ -708,6 +708,8 @@
RelativePath=".\geometry\point.cpp"/> RelativePath=".\geometry\point.cpp"/>
<File <File
RelativePath=".\geometry\rect.cpp"/> RelativePath=".\geometry\rect.cpp"/>
<File
RelativePath=".\misc\selstoretest.cpp"/>
<File <File
RelativePath=".\geometry\size.cpp"/> RelativePath=".\geometry\size.cpp"/>
<File <File

View File

@@ -887,6 +887,9 @@
<File <File
RelativePath=".\geometry\rect.cpp" RelativePath=".\geometry\rect.cpp"
/> />
<File
RelativePath=".\misc\selstoretest.cpp"
/>
<File <File
RelativePath=".\geometry\size.cpp" RelativePath=".\geometry\size.cpp"
/> />