]> git.saurik.com Git - wxWidgets.git/blame - tests/misc/guifuncs.cpp
XRC: make wxSplitterWindow's sashpos and minpanesize dimensions.
[wxWidgets.git] / tests / misc / guifuncs.cpp
CommitLineData
841a25bb
VZ
1///////////////////////////////////////////////////////////////////////////////
2// Name: tests/misc/misctests.cpp
3// Purpose: test miscellaneous GUI functions
4// Author: Vadim Zeitlin
5// Created: 2008-09-22
841a25bb
VZ
6// Copyright: (c) 2008 Vadim Zeitlin
7///////////////////////////////////////////////////////////////////////////////
8
9// ----------------------------------------------------------------------------
10// headers
11// ----------------------------------------------------------------------------
12
13#include "testprec.h"
14
15#ifdef __BORLANDC__
16 #pragma hdrstop
17#endif
18
e18a74e2
VZ
19#include "wx/defs.h"
20
fbfd8b1a
VZ
21#ifndef WX_PRECOMP
22 #include "wx/gdicmn.h"
2ab92d62 23 #include "wx/filefn.h"
fbfd8b1a
VZ
24#endif // !PCH
25
e18a74e2
VZ
26#include "wx/app.h"
27#include "wx/button.h"
791f7574
VZ
28#include "wx/clipbrd.h"
29#include "wx/dataobj.h"
b785d15d 30#include "wx/panel.h"
841a25bb 31
44040e5e
VZ
32#include "asserthelper.h"
33
841a25bb
VZ
34// ----------------------------------------------------------------------------
35// test class
36// ----------------------------------------------------------------------------
37
38class MiscGUIFuncsTestCase : public CppUnit::TestCase
39{
40public:
41 MiscGUIFuncsTestCase() { }
42
43private:
44 CPPUNIT_TEST_SUITE( MiscGUIFuncsTestCase );
45 CPPUNIT_TEST( DisplaySize );
791f7574 46 CPPUNIT_TEST( URLDataObject );
2ab92d62 47 CPPUNIT_TEST( ParseFileDialogFilter );
44040e5e 48 CPPUNIT_TEST( ClientToScreen );
e18a74e2 49 CPPUNIT_TEST( FindWindowAtPoint );
841a25bb
VZ
50 CPPUNIT_TEST_SUITE_END();
51
52 void DisplaySize();
791f7574 53 void URLDataObject();
2ab92d62 54 void ParseFileDialogFilter();
44040e5e 55 void ClientToScreen();
e18a74e2 56 void FindWindowAtPoint();
841a25bb
VZ
57
58 DECLARE_NO_COPY_CLASS(MiscGUIFuncsTestCase)
59};
60
61// register in the unnamed registry so that these tests are run by default
62CPPUNIT_TEST_SUITE_REGISTRATION( MiscGUIFuncsTestCase );
63
e3778b4d 64// also include in its own registry so that these tests can be run alone
841a25bb
VZ
65CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( MiscGUIFuncsTestCase, "MiscGUIFuncsTestCase" );
66
67void MiscGUIFuncsTestCase::DisplaySize()
68{
69 // test that different (almost) overloads return the same results
70 int w, h;
71 wxDisplaySize(&w, &h);
72 wxSize sz = wxGetDisplaySize();
73
74 CPPUNIT_ASSERT_EQUAL( w, sz.x );
75 CPPUNIT_ASSERT_EQUAL( h, sz.y );
76
77 // test that passing NULL works as expected, e.g. doesn't crash
78 wxDisplaySize(NULL, NULL);
79 wxDisplaySize(&w, NULL);
80 wxDisplaySize(NULL, &h);
81
82 CPPUNIT_ASSERT_EQUAL( w, sz.x );
83 CPPUNIT_ASSERT_EQUAL( h, sz.y );
84
85 // test that display PPI is something reasonable
86 sz = wxGetDisplayPPI();
87 CPPUNIT_ASSERT( sz.x < 1000 && sz.y < 1000 );
88}
89
791f7574
VZ
90void MiscGUIFuncsTestCase::URLDataObject()
91{
92 // this tests for buffer overflow, see #11102
93 const char * const
94 url = "http://something.long.to.overwrite.plenty.memory.example.com";
95 wxURLDataObject * const dobj = new wxURLDataObject(url);
96 CPPUNIT_ASSERT_EQUAL( url, dobj->GetURL() );
97
98 wxClipboardLocker lockClip;
99 CPPUNIT_ASSERT( wxTheClipboard->SetData(dobj) );
100 wxTheClipboard->Flush();
101}
102
2ab92d62
VZ
103void MiscGUIFuncsTestCase::ParseFileDialogFilter()
104{
105 wxArrayString descs,
106 filters;
107
108 CPPUNIT_ASSERT_EQUAL
109 (
110 1,
111 wxParseCommonDialogsFilter("Image files|*.jpg;*.png", descs, filters)
112 );
113
114 CPPUNIT_ASSERT_EQUAL( "Image files", descs[0] );
115 CPPUNIT_ASSERT_EQUAL( "*.jpg;*.png", filters[0] );
116
117 CPPUNIT_ASSERT_EQUAL
118 (
119 2,
120 wxParseCommonDialogsFilter
121 (
122 "All files (*.*)|*.*|Python source (*.py)|*.py",
123 descs, filters
124 )
125 );
126
127 CPPUNIT_ASSERT_EQUAL( "*.*", filters[0] );
128 CPPUNIT_ASSERT_EQUAL( "*.py", filters[1] );
129
130 // Test some invalid ones too.
131 WX_ASSERT_FAILS_WITH_ASSERT
132 (
133 wxParseCommonDialogsFilter
134 (
135 "All files (*.*)|*.*|Python source (*.py)|*.py|",
136 descs, filters
137 )
138 );
139}
140
44040e5e
VZ
141void MiscGUIFuncsTestCase::ClientToScreen()
142{
143 wxWindow* const tlw = wxTheApp->GetTopWindow();
144 CPPUNIT_ASSERT( tlw );
145
146 wxPanel* const
147 p1 = new wxPanel(tlw, wxID_ANY, wxPoint(0, 0), wxSize(100, 50));
148 wxPanel* const
149 p2 = new wxPanel(tlw, wxID_ANY, wxPoint(0, 50), wxSize(100, 50));
150 wxWindow* const
151 b = new wxWindow(p2, wxID_ANY, wxPoint(10, 10), wxSize(30, 10));
152
153 // We need this to realize the windows created above under wxGTK.
154 wxYield();
155
156 const wxPoint tlwOrig = tlw->ClientToScreen(wxPoint(0, 0));
157
158 CPPUNIT_ASSERT_EQUAL
159 (
160 tlwOrig + wxPoint(0, 50),
161 p2->ClientToScreen(wxPoint(0, 0))
162 );
163
164 CPPUNIT_ASSERT_EQUAL
165 (
166 tlwOrig + wxPoint(10, 60),
167 b->ClientToScreen(wxPoint(0, 0))
168 );
169
170 p1->Destroy();
171 p2->Destroy();
172}
173
ab45fb14
VZ
174namespace
175{
176
177// This class is used as a test window here. We can't use a real wxButton
178// because we can't create other windows as its children in wxGTK.
179class TestButton : public wxWindow
180{
181public:
182 TestButton(wxWindow* parent, const wxString& label, const wxPoint& pos)
183 : wxWindow(parent, wxID_ANY, pos, wxSize(100, 50))
184 {
185 SetLabel(label);
186 }
187};
188
189// Helper function returning the label of the window at the given point or
190// "NONE" if there is no window there.
191wxString GetLabelOfWindowAtPoint(wxWindow* parent, int x, int y)
192{
193 wxWindow* const
194 win = wxFindWindowAtPoint(parent->ClientToScreen(wxPoint(x, y)));
195 return win ? win->GetLabel() : wxString("NONE");
196}
197
198} // anonymous namespace
199
e18a74e2
VZ
200void MiscGUIFuncsTestCase::FindWindowAtPoint()
201{
202 wxWindow* const parent = wxTheApp->GetTopWindow();
203 CPPUNIT_ASSERT( parent );
204
ab45fb14
VZ
205 // Set a label to allow distinguishing it from the other windows in the
206 // assertion messages.
207 parent->SetLabel("parent");
208
92c9a59d
VZ
209 wxWindow* btn1 = new TestButton(parent, "1", wxPoint(10, 10));
210 wxWindow* btn2 = new TestButton(parent, "2", wxPoint(10, 90));
211 wxWindow* btn3 = new TestButton(btn2, "3", wxPoint(20, 20));
212
213 // We need this to realize the windows created above under wxGTK.
214 wxYield();
215
ab45fb14 216 CPPUNIT_ASSERT_EQUAL_MESSAGE
e18a74e2
VZ
217 (
218 "No window for a point outside of the window",
ab45fb14
VZ
219 "NONE",
220 GetLabelOfWindowAtPoint(parent, 900, 900)
e18a74e2
VZ
221 );
222
e18a74e2
VZ
223 CPPUNIT_ASSERT_EQUAL_MESSAGE
224 (
225 "Point over a child control corresponds to it",
ab45fb14
VZ
226 btn1->GetLabel(),
227 GetLabelOfWindowAtPoint(parent, 11, 11)
e18a74e2
VZ
228 );
229
230 CPPUNIT_ASSERT_EQUAL_MESSAGE
231 (
232 "Point outside of any child control returns the TLW itself",
ab45fb14
VZ
233 parent->GetLabel(),
234 GetLabelOfWindowAtPoint(parent, 5, 5)
e18a74e2
VZ
235 );
236
e18a74e2
VZ
237 btn2->Disable();
238 CPPUNIT_ASSERT_EQUAL_MESSAGE
239 (
240 "Point over a disabled child control still corresponds to it",
ab45fb14
VZ
241 btn2->GetLabel(),
242 GetLabelOfWindowAtPoint(parent, 11, 91)
e18a74e2
VZ
243 );
244
245 btn2->Hide();
246 CPPUNIT_ASSERT_EQUAL_MESSAGE
247 (
248 "Point over a hidden child control doesn't take it into account",
ab45fb14
VZ
249 parent->GetLabel(),
250 GetLabelOfWindowAtPoint(parent, 11, 91)
e18a74e2 251 );
e7aa703d 252
0825f0ba 253 btn2->Show();
92c9a59d
VZ
254 CPPUNIT_ASSERT_EQUAL_MESSAGE
255 (
256 "Point over child control corresponds to the child",
257 btn3->GetLabel(),
258 GetLabelOfWindowAtPoint(parent, 31, 111)
259 );
260
0825f0ba
VZ
261 btn3->Disable();
262 CPPUNIT_ASSERT_EQUAL_MESSAGE
263 (
92c9a59d 264 "Point over disabled child controls still corresponds to this child",
ab45fb14 265 btn3->GetLabel(),
92c9a59d 266 GetLabelOfWindowAtPoint(parent, 31, 111)
0825f0ba 267 );
0825f0ba 268
92c9a59d
VZ
269 btn1->Destroy();
270 btn2->Destroy();
271 // btn3 was already deleted when its parent was
e18a74e2 272}