]> git.saurik.com Git - wxWidgets.git/blame_incremental - tests/graphics/measuring.cpp
Ensure that detached menus don't keep focus grab in wxGTK.
[wxWidgets.git] / tests / graphics / measuring.cpp
... / ...
CommitLineData
1///////////////////////////////////////////////////////////////////////////////
2// Name: tests/graphics/measuring.cpp
3// Purpose: Tests for wxGraphicsRenderer::CreateMeasuringContext
4// Author: Kevin Ollivier, Vadim Zeitlin (non wxGC parts)
5// Created: 2008-02-12
6// RCS-ID: $Id$
7// Copyright: (c) 2008 Kevin Ollivier <kevino@theolliviers.com>
8// (c) 2012 Vadim Zeitlin <vadim@wxwidgets.org>
9///////////////////////////////////////////////////////////////////////////////
10
11// ----------------------------------------------------------------------------
12// headers
13// ----------------------------------------------------------------------------
14
15#include "testprec.h"
16
17#ifdef __BORLANDC__
18 #pragma hdrstop
19#endif
20
21#ifndef WX_PRECOMP
22 #include "wx/app.h"
23 #include "wx/font.h"
24 #include "wx/window.h"
25#endif // WX_PRECOMP
26
27// wxCairoRenderer::CreateMeasuringContext() is not implement for wxX11
28#if wxUSE_GRAPHICS_CONTEXT && !defined(__WXX11__)
29 #include "wx/graphics.h"
30 #define TEST_GC
31#endif
32
33#include "wx/dcclient.h"
34#include "wx/dcps.h"
35#include "wx/metafile.h"
36
37// ----------------------------------------------------------------------------
38// test class
39// ----------------------------------------------------------------------------
40
41class MeasuringTextTestCase : public CppUnit::TestCase
42{
43public:
44 MeasuringTextTestCase() { }
45
46private:
47 CPPUNIT_TEST_SUITE( MeasuringTextTestCase );
48 CPPUNIT_TEST( DCGetTextExtent );
49 CPPUNIT_TEST( WindowGetTextExtent );
50 CPPUNIT_TEST( GetPartialTextExtent );
51#ifdef TEST_GC
52 CPPUNIT_TEST( GraphicsGetTextExtent );
53#endif // TEST_GC
54 CPPUNIT_TEST_SUITE_END();
55
56 void DCGetTextExtent();
57 void WindowGetTextExtent();
58
59 void GetPartialTextExtent();
60
61#ifdef TEST_GC
62 void GraphicsGetTextExtent();
63#endif // TEST_GC
64
65 DECLARE_NO_COPY_CLASS(MeasuringTextTestCase)
66};
67
68// register in the unnamed registry so that these tests are run by default
69CPPUNIT_TEST_SUITE_REGISTRATION( MeasuringTextTestCase );
70
71// also include in its own registry so that these tests can be run alone
72CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( MeasuringTextTestCase, "MeasuringTextTestCase" );
73
74// ----------------------------------------------------------------------------
75// helper for XXXTextExtent() methods
76// ----------------------------------------------------------------------------
77
78template <typename T>
79struct GetTextExtentTester
80{
81 // Constructor runs a couple of simple tests for GetTextExtent().
82 GetTextExtentTester(const T& obj)
83 {
84 // Test that getting the height only doesn't crash.
85 int y;
86 obj.GetTextExtent("H", NULL, &y);
87
88 CPPUNIT_ASSERT( y > 1 );
89
90 wxSize size = obj.GetTextExtent("Hello");
91 CPPUNIT_ASSERT( size.x > 1 );
92 CPPUNIT_ASSERT_EQUAL( y, size.y );
93 }
94};
95
96// ----------------------------------------------------------------------------
97// tests themselves
98// ----------------------------------------------------------------------------
99
100void MeasuringTextTestCase::DCGetTextExtent()
101{
102 wxClientDC dc(wxTheApp->GetTopWindow());
103
104 GetTextExtentTester<wxClientDC> testDC(dc);
105
106 int w;
107 dc.GetMultiLineTextExtent("Good\nbye", &w, NULL);
108 const wxSize sz = dc.GetTextExtent("Good");
109 CPPUNIT_ASSERT_EQUAL( sz.x, w );
110
111 CPPUNIT_ASSERT( dc.GetMultiLineTextExtent("Good\nbye").y >= 2*sz.y );
112
113 // Test the functions with some other DC kinds also.
114#if wxUSE_PRINTING_ARCHITECTURE && wxUSE_POSTSCRIPT
115 wxPostScriptDC psdc;
116 // wxPostScriptDC doesn't have any font set by default but its
117 // GetTextExtent() requires one to be set. This is probably a bug and we
118 // should set the default font in it implicitly but for now just work
119 // around it.
120 psdc.SetFont(*wxNORMAL_FONT);
121 GetTextExtentTester<wxPostScriptDC> testPS(psdc);
122#endif
123
124#if wxUSE_ENH_METAFILE
125 wxEnhMetaFileDC metadc;
126 GetTextExtentTester<wxEnhMetaFileDC> testMF(metadc);
127#endif
128}
129
130void MeasuringTextTestCase::WindowGetTextExtent()
131{
132 wxWindow* const win = wxTheApp->GetTopWindow();
133
134 GetTextExtentTester<wxWindow> testWin(*win);
135}
136
137void MeasuringTextTestCase::GetPartialTextExtent()
138{
139 wxClientDC dc(wxTheApp->GetTopWindow());
140
141 wxArrayInt widths;
142 CPPUNIT_ASSERT( dc.GetPartialTextExtents("Hello", widths) );
143 CPPUNIT_ASSERT_EQUAL( 5, widths.size() );
144 CPPUNIT_ASSERT_EQUAL( widths[0], dc.GetTextExtent("H").x );
145 CPPUNIT_ASSERT_EQUAL( widths[4], dc.GetTextExtent("Hello").x );
146}
147
148#ifdef TEST_GC
149
150void MeasuringTextTestCase::GraphicsGetTextExtent()
151{
152 wxGraphicsRenderer* renderer = wxGraphicsRenderer::GetDefaultRenderer();
153 CPPUNIT_ASSERT(renderer);
154 wxGraphicsContext* context = renderer->CreateMeasuringContext();
155 CPPUNIT_ASSERT(context);
156 wxFont font(12, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
157 CPPUNIT_ASSERT(font.IsOk());
158 context->SetFont(font, *wxBLACK);
159 double width, height, descent, externalLeading = 0.0;
160 context->GetTextExtent("x", &width, &height, &descent, &externalLeading);
161
162 // TODO: Determine a way to make these tests more robust.
163 CPPUNIT_ASSERT(width > 0.0);
164 CPPUNIT_ASSERT(height > 0.0);
165
166}
167
168#endif // TEST_GC