Files
wxWidgets/tests/rowheightcache/rowheightcachetest.cpp
Vadim Zeitlin d1b02b8dd6 Fix memory leaks in newly added unit test
There is no need to allocate neither RowRanges nor HeightCache on the
heap, just create them on the stack -- if nothing else, this ensures we
don't leak memory, unlike before.
2018-12-07 04:17:16 +01:00

276 lines
7.2 KiB
C++

///////////////////////////////////////////////////////////////////////////////
// Name: tests/rowheightcache/rowheightcachetest.cpp
// Purpose: unit tests for the row height cache of a dataview
// Author: Jens Goepfert (mail@jensgoepfert.de)
// Created: 2018-03-06
// Copyright: (c) wxWidgets team
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
#include "testprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#endif
#include "wx/generic/private/rowheightcache.h"
// ----------------------------------------------------------------------------
// TestRowRangesAdd
// ----------------------------------------------------------------------------
TEST_CASE("RowHeightCacheTestCase::TestRowRangesSimple", "[dataview][heightcache]")
{
RowRanges rr;
CHECK(rr.CountAll() == 0);
for (unsigned int i = 0; i <= 10; i++)
{
CHECK(rr.Has(i) == false);
rr.Add(i);
CHECK(rr.CountAll() == i+1);
CHECK(rr.CountTo(i) == i);
CHECK(rr.Has(i) == true);
}
CHECK(rr.GetSize() == 1); // every row is sorted in the same range, so count == 1
CHECK(rr.CountAll() == 11); // 11 rows collected
CHECK(rr.CountTo(10) == 10);
rr.Add(5); // row 5 already contained -> does nothing
CHECK(rr.GetSize() == 1); // every row is sorted in the same range, so count == 1
CHECK(rr.CountAll() == 11); // 11 rows collected
CHECK(rr.CountTo(10) == 10);
for (int i = 10; i >= 0; i--)
{
CHECK(rr.CountAll() == (unsigned)i+1);
CHECK(rr.CountTo((unsigned)i) == (unsigned)i);
rr.Remove(i);
CHECK(rr.CountAll() == (unsigned)i);
CHECK(rr.CountTo((unsigned)i) == (unsigned)i);
}
CHECK(rr.CountAll() == 0); // everything removed, no row range is left behind
for (int i = 10; i > 0; i--)
{
CHECK(rr.CountTo(i) == 0);
}
CHECK(rr.GetSize() == 0);
}
// ----------------------------------------------------------------------------
// TestRowRangesRemove
// ----------------------------------------------------------------------------
TEST_CASE("RowHeightCacheTestCase::TestRowRangesGapsMod2", "[dataview][heightcache]")
{
RowRanges rr;
for (int i = 0; i < 100; i++)
{
CHECK(rr.Has(i) == false);
if (i % 2 == 0)
{
rr.Add(i);
}
}
CHECK(rr.CountAll() == 50);
CHECK(rr.CountTo(100) == 50);
for (unsigned int i = 99; i > 0; i--)
{
if (i % 2 == 0)
{
CHECK(rr.Has(i) == true);
rr.Remove(i);
CHECK(rr.Has(i) == false);
}
else
{
CHECK(rr.Has(i) == false);
}
}
// only row 0 is in the RowRanges, so remove 1 does nothing
rr.Remove(1);
CHECK(rr.CountAll() == 1);
CHECK(rr.CountTo(0) == 0);
CHECK(rr.CountTo(1) == 1);
CHECK(rr.CountTo(100) == 1);
CHECK(rr.GetSize() == 1);
rr.Remove(0); // last row is beeing removed
CHECK(rr.CountAll() == 0);
CHECK(rr.CountTo(0) == 0);
CHECK(rr.CountTo(1) == 0);
CHECK(rr.CountTo(100) == 0);
CHECK(rr.GetSize() == 0);
rr.Add(10);
CHECK(rr.GetSize() == 1);
CHECK(rr.CountTo(1) == 0); // tests CountTo first break
rr.Add(5); // inserts a range at the beginning
CHECK(rr.GetSize() == 2);
rr.Remove(10);
rr.Remove(5);
CHECK(rr.GetSize() == 0);
}
// ----------------------------------------------------------------------------
// TestRowRangesCleanUp1
// ----------------------------------------------------------------------------
TEST_CASE("RowHeightCacheTestCase::TestRowRangesCleanUp1", "[dataview][heightcache]")
{
RowRanges rr;
for (unsigned int i = 0; i < 100; i++)
{
CHECK(rr.Has(i) == false);
if (i % 2 == 0)
{
rr.Add(i);
}
}
CHECK(rr.GetSize() == 50); // adding 50 rows (only even) results in 50 range objects
CHECK(rr.CountAll() == 50);
CHECK(rr.CountTo(100) == 50);
for (unsigned int i = 0; i < 100; i++)
{
if (i % 2 == 1)
{
rr.Add(i);
}
}
CHECK(rr.GetSize() == 1); // adding 50 rows (only odd) should combined to 1 range object
CHECK(rr.CountAll() == 100);
CHECK(rr.CountTo(100) == 100);
}
// ----------------------------------------------------------------------------
// TestRowRangesCleanUp2
// ----------------------------------------------------------------------------
TEST_CASE("RowHeightCacheTestCase::TestRowRangesCleanUp2", "[dataview][heightcache]")
{
RowRanges rr;
for (unsigned int i = 0; i < 10; i++)
{
rr.Add(i);
}
CHECK(rr.GetSize() == 1); // adding 10 sequent rows results in 1 range objects
CHECK(rr.CountAll() == 10);
CHECK(rr.CountTo(100) == 10);
for (unsigned int i = 12; i < 20; i++)
{
rr.Add(i);
}
CHECK(rr.GetSize() == 2);
rr.Add(11); // tests extending a range at the beginning (to the left)
CHECK(rr.GetSize() == 2);
rr.Add(10); // extends a range and reduces them
CHECK(rr.GetSize() == 1);
}
// ----------------------------------------------------------------------------
// TestHeightCache
// ----------------------------------------------------------------------------
TEST_CASE("RowHeightCacheTestCase::TestHeightCache", "[dataview][heightcache]")
{
HeightCache hc;
for (unsigned int i = 0; i <= 10; i++)
{
hc.Put(i, 22);
}
for (unsigned int i = 15; i <= 17; i++)
{
hc.Put(i, 22);
}
for (unsigned int i = 20; i <= 2000; i++)
{
hc.Put(i, 22);
}
hc.Put(11, 42);
hc.Put(12, 42);
hc.Put(18, 42);
hc.Put(13, 62);
hc.Put(14, 62);
hc.Put(19, 62);
int start = 0;
int height = 0;
unsigned int row = 666;
CHECK(hc.GetLineStart(1000, start) == true);
CHECK(start == 22180);
CHECK(hc.GetLineHeight(1000, height) == true);
CHECK(height == 22);
CHECK(hc.GetLineHeight(5000, start) == false);
// test invalid y
CHECK(hc.GetLineAt(-1, row) == false);
CHECK(row == 666);
// test start of first row
CHECK(hc.GetLineAt(0, row) == true);
CHECK(row == 0);
// test end of first row
CHECK(hc.GetLineAt(21, row) == true);
CHECK(row == 0);
// test start of second row
CHECK(hc.GetLineAt(22, row) == true);
CHECK(row == 1);
hc.Remove(1000); // Delete row 1000 and everything behind
CHECK(hc.GetLineAt(22179, row) == true);
CHECK(row == 999);
CHECK(hc.GetLineHeight(999, height) == true);
CHECK(height == 22);
row = 666;
height = 666;
CHECK(hc.GetLineAt(22180, row) == false);
CHECK(row == 666);
CHECK(hc.GetLineHeight(1000, height) == false);
CHECK(height == 666);
hc.Clear(); // Clear all items
for (int i = 20; i <= 2000; i++)
{
height = 666;
CHECK(hc.GetLineHeight(i, height) == false);
CHECK(height == 666);
}
hc.Clear(); // Clear twice should not crash
row = 666;
height = 666;
CHECK(hc.GetLineAt(22180, row) == false);
CHECK(row == 666);
}