Fix totally broken LocaleSetter class in the test suite.
[wxWidgets.git] / tests / graphics / measuring.cpp
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
41 class MeasuringTextTestCase : public CppUnit::TestCase
42 {
43 public:
44 MeasuringTextTestCase() { }
45
46 private:
47 CPPUNIT_TEST_SUITE( MeasuringTextTestCase );
48 CPPUNIT_TEST( DCGetTextExtent );
49 CPPUNIT_TEST( LeadingAndDescent );
50 CPPUNIT_TEST( WindowGetTextExtent );
51 CPPUNIT_TEST( GetPartialTextExtent );
52 #ifdef TEST_GC
53 CPPUNIT_TEST( GraphicsGetTextExtent );
54 #endif // TEST_GC
55 CPPUNIT_TEST_SUITE_END();
56
57 void DCGetTextExtent();
58 void LeadingAndDescent();
59 void WindowGetTextExtent();
60
61 void GetPartialTextExtent();
62
63 #ifdef TEST_GC
64 void GraphicsGetTextExtent();
65 #endif // TEST_GC
66
67 DECLARE_NO_COPY_CLASS(MeasuringTextTestCase)
68 };
69
70 // register in the unnamed registry so that these tests are run by default
71 CPPUNIT_TEST_SUITE_REGISTRATION( MeasuringTextTestCase );
72
73 // also include in its own registry so that these tests can be run alone
74 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( MeasuringTextTestCase, "MeasuringTextTestCase" );
75
76 // ----------------------------------------------------------------------------
77 // helper for XXXTextExtent() methods
78 // ----------------------------------------------------------------------------
79
80 template <typename T>
81 struct GetTextExtentTester
82 {
83 // Constructor runs a couple of simple tests for GetTextExtent().
84 GetTextExtentTester(const T& obj)
85 {
86 // Test that getting the height only doesn't crash.
87 int y;
88 obj.GetTextExtent("H", NULL, &y);
89
90 CPPUNIT_ASSERT( y > 1 );
91
92 wxSize size = obj.GetTextExtent("Hello");
93 CPPUNIT_ASSERT( size.x > 1 );
94 CPPUNIT_ASSERT_EQUAL( y, size.y );
95 }
96 };
97
98 // ----------------------------------------------------------------------------
99 // tests themselves
100 // ----------------------------------------------------------------------------
101
102 void MeasuringTextTestCase::DCGetTextExtent()
103 {
104 wxClientDC dc(wxTheApp->GetTopWindow());
105
106 GetTextExtentTester<wxClientDC> testDC(dc);
107
108 int w;
109 dc.GetMultiLineTextExtent("Good\nbye", &w, NULL);
110 const wxSize sz = dc.GetTextExtent("Good");
111 CPPUNIT_ASSERT_EQUAL( sz.x, w );
112
113 CPPUNIT_ASSERT( dc.GetMultiLineTextExtent("Good\nbye").y >= 2*sz.y );
114
115 // Test the functions with some other DC kinds also.
116 #if wxUSE_PRINTING_ARCHITECTURE && wxUSE_POSTSCRIPT
117 wxPostScriptDC psdc;
118 // wxPostScriptDC doesn't have any font set by default but its
119 // GetTextExtent() requires one to be set. This is probably a bug and we
120 // should set the default font in it implicitly but for now just work
121 // around it.
122 psdc.SetFont(*wxNORMAL_FONT);
123 GetTextExtentTester<wxPostScriptDC> testPS(psdc);
124 #endif
125
126 #if wxUSE_ENH_METAFILE
127 wxEnhMetaFileDC metadc;
128 GetTextExtentTester<wxEnhMetaFileDC> testMF(metadc);
129 #endif
130 }
131
132 void MeasuringTextTestCase::LeadingAndDescent()
133 {
134 wxClientDC dc(wxTheApp->GetTopWindow());
135
136 // Retrieving just the descent should work.
137 int descent = -17;
138 dc.GetTextExtent("foo", NULL, NULL, &descent);
139 CPPUNIT_ASSERT( descent != -17 );
140
141 // Same for external leading.
142 int leading = -289;
143 dc.GetTextExtent("foo", NULL, NULL, NULL, &leading);
144 CPPUNIT_ASSERT( leading != -289 );
145
146 // And both should also work for the empty string as they retrieve the
147 // values valid for the entire font and not just this string.
148 int descent2,
149 leading2;
150 dc.GetTextExtent("", NULL, NULL, &descent2, &leading2);
151
152 CPPUNIT_ASSERT_EQUAL( descent, descent2 );
153 CPPUNIT_ASSERT_EQUAL( leading, leading2 );
154 }
155
156 void MeasuringTextTestCase::WindowGetTextExtent()
157 {
158 wxWindow* const win = wxTheApp->GetTopWindow();
159
160 GetTextExtentTester<wxWindow> testWin(*win);
161 }
162
163 void MeasuringTextTestCase::GetPartialTextExtent()
164 {
165 wxClientDC dc(wxTheApp->GetTopWindow());
166
167 wxArrayInt widths;
168 CPPUNIT_ASSERT( dc.GetPartialTextExtents("Hello", widths) );
169 CPPUNIT_ASSERT_EQUAL( 5, widths.size() );
170 CPPUNIT_ASSERT_EQUAL( widths[0], dc.GetTextExtent("H").x );
171 CPPUNIT_ASSERT_EQUAL( widths[4], dc.GetTextExtent("Hello").x );
172 }
173
174 #ifdef TEST_GC
175
176 void MeasuringTextTestCase::GraphicsGetTextExtent()
177 {
178 wxGraphicsRenderer* renderer = wxGraphicsRenderer::GetDefaultRenderer();
179 CPPUNIT_ASSERT(renderer);
180 wxGraphicsContext* context = renderer->CreateMeasuringContext();
181 CPPUNIT_ASSERT(context);
182 wxFont font(12, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
183 CPPUNIT_ASSERT(font.IsOk());
184 context->SetFont(font, *wxBLACK);
185 double width, height, descent, externalLeading = 0.0;
186 context->GetTextExtent("x", &width, &height, &descent, &externalLeading);
187
188 // TODO: Determine a way to make these tests more robust.
189 CPPUNIT_ASSERT(width > 0.0);
190 CPPUNIT_ASSERT(height > 0.0);
191
192 }
193
194 #endif // TEST_GC