wxWidgets/tests/graphics/measuring.cpp
Vadim Zeitlin 3f66f6a5b3 Remove all lines containing cvs/svn "$Id$" keyword.
This keyword is not expanded by Git which means it's not replaced with the
correct revision value in the releases made using git-based scripts and it's
confusing to have lines with unexpanded "$Id$" in the released files. As
expanding them with Git is not that simple (it could be done with git archive
and export-subst attribute) and there are not many benefits in having them in
the first place, just remove all these lines.

If nothing else, this will make an eventual transition to Git simpler.

Closes #14487.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74602 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2013-07-26 16:02:46 +00:00

194 lines
5.9 KiB
C++

///////////////////////////////////////////////////////////////////////////////
// Name: tests/graphics/measuring.cpp
// Purpose: Tests for wxGraphicsRenderer::CreateMeasuringContext
// Author: Kevin Ollivier, Vadim Zeitlin (non wxGC parts)
// Created: 2008-02-12
// Copyright: (c) 2008 Kevin Ollivier <kevino@theolliviers.com>
// (c) 2012 Vadim Zeitlin <vadim@wxwidgets.org>
///////////////////////////////////////////////////////////////////////////////
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
#include "testprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/app.h"
#include "wx/font.h"
#include "wx/window.h"
#endif // WX_PRECOMP
// wxCairoRenderer::CreateMeasuringContext() is not implement for wxX11
#if wxUSE_GRAPHICS_CONTEXT && !defined(__WXX11__)
#include "wx/graphics.h"
#define TEST_GC
#endif
#include "wx/dcclient.h"
#include "wx/dcps.h"
#include "wx/metafile.h"
// ----------------------------------------------------------------------------
// test class
// ----------------------------------------------------------------------------
class MeasuringTextTestCase : public CppUnit::TestCase
{
public:
MeasuringTextTestCase() { }
private:
CPPUNIT_TEST_SUITE( MeasuringTextTestCase );
CPPUNIT_TEST( DCGetTextExtent );
CPPUNIT_TEST( LeadingAndDescent );
CPPUNIT_TEST( WindowGetTextExtent );
CPPUNIT_TEST( GetPartialTextExtent );
#ifdef TEST_GC
CPPUNIT_TEST( GraphicsGetTextExtent );
#endif // TEST_GC
CPPUNIT_TEST_SUITE_END();
void DCGetTextExtent();
void LeadingAndDescent();
void WindowGetTextExtent();
void GetPartialTextExtent();
#ifdef TEST_GC
void GraphicsGetTextExtent();
#endif // TEST_GC
DECLARE_NO_COPY_CLASS(MeasuringTextTestCase)
};
// register in the unnamed registry so that these tests are run by default
CPPUNIT_TEST_SUITE_REGISTRATION( MeasuringTextTestCase );
// also include in its own registry so that these tests can be run alone
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( MeasuringTextTestCase, "MeasuringTextTestCase" );
// ----------------------------------------------------------------------------
// helper for XXXTextExtent() methods
// ----------------------------------------------------------------------------
template <typename T>
struct GetTextExtentTester
{
// Constructor runs a couple of simple tests for GetTextExtent().
GetTextExtentTester(const T& obj)
{
// Test that getting the height only doesn't crash.
int y;
obj.GetTextExtent("H", NULL, &y);
CPPUNIT_ASSERT( y > 1 );
wxSize size = obj.GetTextExtent("Hello");
CPPUNIT_ASSERT( size.x > 1 );
CPPUNIT_ASSERT_EQUAL( y, size.y );
}
};
// ----------------------------------------------------------------------------
// tests themselves
// ----------------------------------------------------------------------------
void MeasuringTextTestCase::DCGetTextExtent()
{
wxClientDC dc(wxTheApp->GetTopWindow());
GetTextExtentTester<wxClientDC> testDC(dc);
int w;
dc.GetMultiLineTextExtent("Good\nbye", &w, NULL);
const wxSize sz = dc.GetTextExtent("Good");
CPPUNIT_ASSERT_EQUAL( sz.x, w );
CPPUNIT_ASSERT( dc.GetMultiLineTextExtent("Good\nbye").y >= 2*sz.y );
// Test the functions with some other DC kinds also.
#if wxUSE_PRINTING_ARCHITECTURE && wxUSE_POSTSCRIPT
wxPostScriptDC psdc;
// wxPostScriptDC doesn't have any font set by default but its
// GetTextExtent() requires one to be set. This is probably a bug and we
// should set the default font in it implicitly but for now just work
// around it.
psdc.SetFont(*wxNORMAL_FONT);
GetTextExtentTester<wxPostScriptDC> testPS(psdc);
#endif
#if wxUSE_ENH_METAFILE
wxEnhMetaFileDC metadc;
GetTextExtentTester<wxEnhMetaFileDC> testMF(metadc);
#endif
}
void MeasuringTextTestCase::LeadingAndDescent()
{
wxClientDC dc(wxTheApp->GetTopWindow());
// Retrieving just the descent should work.
int descent = -17;
dc.GetTextExtent("foo", NULL, NULL, &descent);
CPPUNIT_ASSERT( descent != -17 );
// Same for external leading.
int leading = -289;
dc.GetTextExtent("foo", NULL, NULL, NULL, &leading);
CPPUNIT_ASSERT( leading != -289 );
// And both should also work for the empty string as they retrieve the
// values valid for the entire font and not just this string.
int descent2,
leading2;
dc.GetTextExtent("", NULL, NULL, &descent2, &leading2);
CPPUNIT_ASSERT_EQUAL( descent, descent2 );
CPPUNIT_ASSERT_EQUAL( leading, leading2 );
}
void MeasuringTextTestCase::WindowGetTextExtent()
{
wxWindow* const win = wxTheApp->GetTopWindow();
GetTextExtentTester<wxWindow> testWin(*win);
}
void MeasuringTextTestCase::GetPartialTextExtent()
{
wxClientDC dc(wxTheApp->GetTopWindow());
wxArrayInt widths;
CPPUNIT_ASSERT( dc.GetPartialTextExtents("Hello", widths) );
CPPUNIT_ASSERT_EQUAL( 5, widths.size() );
CPPUNIT_ASSERT_EQUAL( widths[0], dc.GetTextExtent("H").x );
CPPUNIT_ASSERT_EQUAL( widths[4], dc.GetTextExtent("Hello").x );
}
#ifdef TEST_GC
void MeasuringTextTestCase::GraphicsGetTextExtent()
{
wxGraphicsRenderer* renderer = wxGraphicsRenderer::GetDefaultRenderer();
CPPUNIT_ASSERT(renderer);
wxGraphicsContext* context = renderer->CreateMeasuringContext();
CPPUNIT_ASSERT(context);
wxFont font(12, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
CPPUNIT_ASSERT(font.IsOk());
context->SetFont(font, *wxBLACK);
double width, height, descent, externalLeading = 0.0;
context->GetTextExtent("x", &width, &height, &descent, &externalLeading);
// TODO: Determine a way to make these tests more robust.
CPPUNIT_ASSERT(width > 0.0);
CPPUNIT_ASSERT(height > 0.0);
}
#endif // TEST_GC