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.
		
			
				
	
	
		
			276 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			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);
 | 
						|
}
 |