wxWidgets/tests/misc/misctests.cpp
Vadim Zeitlin ef92b92691 Add unit test for wxCTZ
Check that the new function works reasonably correctly.
2018-11-05 19:27:53 +01:00

164 lines
4.0 KiB
C++

///////////////////////////////////////////////////////////////////////////////
// Name: tests/misc/misctests.cpp
// Purpose: test miscellaneous stuff
// Author: Peter Most, Vadim Zeitlin
// Created: 2008-07-10
// Copyright: (c) 2008 Peter Most
// (c) 2009 Vadim Zeitlin
///////////////////////////////////////////////////////////////////////////////
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
#include "testprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/defs.h"
#include "wx/math.h"
// just some classes using wxRTTI for wxStaticCast() test
#include "wx/tarstrm.h"
#include "wx/zipstrm.h"
// ----------------------------------------------------------------------------
// test class
// ----------------------------------------------------------------------------
class MiscTestCase : public CppUnit::TestCase
{
public:
MiscTestCase() { }
private:
CPPUNIT_TEST_SUITE( MiscTestCase );
CPPUNIT_TEST( Assert );
#ifdef HAVE_VARIADIC_MACROS
CPPUNIT_TEST( CallForEach );
#endif // HAVE_VARIADIC_MACROS
CPPUNIT_TEST( Delete );
CPPUNIT_TEST( StaticCast );
CPPUNIT_TEST_SUITE_END();
void Assert();
void CallForEach();
void Delete();
void StaticCast();
wxDECLARE_NO_COPY_CLASS(MiscTestCase);
};
// register in the unnamed registry so that these tests are run by default
CPPUNIT_TEST_SUITE_REGISTRATION( MiscTestCase );
// also include in its own registry so that these tests can be run alone
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( MiscTestCase, "MiscTestCase" );
namespace
{
bool AssertIfOdd(int n)
{
wxCHECK_MSG( !(n % 2), false, "parameter must be even" );
return true;
}
} // anonymous namespace
void MiscTestCase::Assert()
{
AssertIfOdd(0);
WX_ASSERT_FAILS_WITH_ASSERT(AssertIfOdd(1));
// doesn't fail any more
wxAssertHandler_t oldHandler = wxSetAssertHandler(NULL);
AssertIfOdd(17);
wxSetAssertHandler(oldHandler);
}
#ifdef HAVE_VARIADIC_MACROS
void MiscTestCase::CallForEach()
{
#define MY_MACRO(pos, str) s += str;
wxString s;
wxCALL_FOR_EACH(MY_MACRO, "foo", "bar", "baz");
CPPUNIT_ASSERT_EQUAL( "foobarbaz", s );
#undef MY_MACRO
}
#endif // HAVE_VARIADIC_MACROS
void MiscTestCase::Delete()
{
// Allocate some arbitrary memory to get a valid pointer:
long *pointer = new long;
CPPUNIT_ASSERT( pointer != NULL );
// Check that wxDELETE sets the pointer to NULL:
wxDELETE( pointer );
CPPUNIT_ASSERT( pointer == NULL );
// Allocate some arbitrary array to get a valid pointer:
long *array = new long[ 3 ];
CPPUNIT_ASSERT( array != NULL );
// Check that wxDELETEA sets the pointer to NULL:
wxDELETEA( array );
CPPUNIT_ASSERT( array == NULL );
// this results in compilation error, as it should
#if 0
struct SomeUnknownStruct *p = NULL;
wxDELETE(p);
#endif
}
namespace
{
// helper function used just to avoid warnings about value computed not being
// used in WX_ASSERT_FAILS_WITH_ASSERT() in StaticCast() below
bool IsNull(void *p)
{
return p == NULL;
}
} // anonymous namespace
void MiscTestCase::StaticCast()
{
#if wxUSE_TARSTREAM
wxTarEntry tarEntry;
CPPUNIT_ASSERT( wxStaticCast(&tarEntry, wxArchiveEntry) );
wxArchiveEntry *entry = &tarEntry;
CPPUNIT_ASSERT( wxStaticCast(entry, wxTarEntry) );
#if wxUSE_ZIPSTREAM
wxZipEntry zipEntry;
entry = &zipEntry;
CPPUNIT_ASSERT( wxStaticCast(entry, wxZipEntry) );
WX_ASSERT_FAILS_WITH_ASSERT( IsNull(wxStaticCast(&zipEntry, wxTarEntry)) );
#endif // wxUSE_ZIPSTREAM
WX_ASSERT_FAILS_WITH_ASSERT( IsNull(wxStaticCast(entry, wxTarEntry)) );
#endif // wxUSE_TARSTREAM
}
TEST_CASE("wxCTZ", "[math]")
{
CHECK( wxCTZ(1) == 0 );
CHECK( wxCTZ(4) == 2 );
CHECK( wxCTZ(17) == 0 );
CHECK( wxCTZ(0x80000000) == 31 );
WX_ASSERT_FAILS_WITH_ASSERT( wxCTZ(0) );
}