More tests for streams.
[wxWidgets.git] / samples / typetest / typetest.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: typetest.cpp
3 // Purpose: Types wxWindows sample
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 04/01/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifdef __GNUG__
13 #pragma implementation "typetest.h"
14 #endif
15
16 // For compilers that support precompilation, includes "wx/wx.h".
17 #include "wx/wxprec.h"
18
19 #ifdef __BORLANDC__
20 #pragma hdrstop
21 #endif
22
23 #ifndef WX_PRECOMP
24 #include "wx/wx.h"
25 #endif
26
27 #include "wx/time.h"
28 #include "wx/date.h"
29 #include "wx/variant.h"
30
31 #include "typetest.h"
32
33 #if defined(__WXGTK__) || defined(__WXMOTIF__)
34 #include "mondrian.xpm"
35 #endif
36
37 #include "wx/ioswrap.h"
38
39 #if wxUSE_IOSTREAMH
40 #include <fstream.h>
41 #else
42 #include <fstream>
43 #endif
44
45 #include "wx/wfstream.h"
46
47
48 // Create a new application object
49 IMPLEMENT_APP (MyApp)
50
51 IMPLEMENT_DYNAMIC_CLASS (MyApp, wxApp)
52
53 BEGIN_EVENT_TABLE(MyApp, wxApp)
54 EVT_MENU(TYPES_DATE, MyApp::DoDateDemo)
55 EVT_MENU(TYPES_TIME, MyApp::DoTimeDemo)
56 EVT_MENU(TYPES_VARIANT, MyApp::DoVariantDemo)
57 EVT_MENU(TYPES_BYTEORDER, MyApp::DoByteOrderDemo)
58 #if wxUSE_UNICODE
59 EVT_MENU(TYPES_UNICODE, MyApp::DoUnicodeDemo)
60 #endif
61 EVT_MENU(TYPES_STREAM, MyApp::DoStreamDemo)
62 END_EVENT_TABLE()
63
64 bool MyApp::OnInit(void)
65 {
66 // Create the main frame window
67 MyFrame *frame = new MyFrame((wxFrame *) NULL, "wxWindows Types Demo",
68 wxPoint(50, 50), wxSize(450, 340));
69
70 // Give it an icon
71 frame->SetIcon(wxICON(mondrian));
72
73 // Make a menubar
74 wxMenu *file_menu = new wxMenu;
75
76 file_menu->Append(TYPES_ABOUT, "&About");
77 file_menu->AppendSeparator();
78 file_menu->Append(TYPES_DATE, "&Date test");
79 file_menu->Append(TYPES_TIME, "&Time test");
80 file_menu->Append(TYPES_VARIANT, "&Variant test");
81 file_menu->Append(TYPES_BYTEORDER, "&Byteorder test");
82 #if wxUSE_UNICODE
83 file_menu->Append(TYPES_UNICODE, "&Unicode test");
84 #endif
85 file_menu->Append(TYPES_STREAM, "&Stream test");
86 file_menu->AppendSeparator();
87 file_menu->Append(TYPES_QUIT, "E&xit");
88 wxMenuBar *menu_bar = new wxMenuBar;
89 menu_bar->Append(file_menu, "&File");
90 frame->SetMenuBar(menu_bar);
91
92 m_textCtrl = new wxTextCtrl(frame, -1, "", wxPoint(0, 0), wxDefaultSize, wxTE_MULTILINE);
93
94 // Show the frame
95 frame->Show(TRUE);
96
97 SetTopWindow(frame);
98
99 return TRUE;
100 }
101
102 void MyApp::DoStreamDemo(wxCommandEvent& WXUNUSED(event))
103 {
104 wxTextCtrl& textCtrl = * GetTextCtrl();
105
106 textCtrl.Clear();
107 textCtrl << "\nTest fstream vs. wxFileStream:\n\n";
108
109 textCtrl.WriteText( "Writing to ofstream and wxFileOutputStream:\n" );
110
111 ofstream std_file_output( "test_std.dat" );
112 wxFileOutputStream file_output( "test_wx.dat" );
113
114 wxString tmp;
115 signed int si = 0xFFFFFFFF;
116 tmp.Printf( "Signed int: %d\n", si );
117 textCtrl.WriteText( tmp );
118 file_output << si << "\n";
119 std_file_output << si << "\n";
120
121 unsigned int ui = 0xFFFFFFFF;
122 tmp.Printf( "Unsigned int: %u\n", ui );
123 textCtrl.WriteText( tmp );
124 file_output << ui << "\n";
125 std_file_output << ui << "\n";
126
127 double d = 2.01234567890123456789;
128 tmp.Printf( "Double: %f\n", d );
129 textCtrl.WriteText( tmp );
130 file_output << d << "\n";
131 std_file_output << d << "\n";
132
133 float f = 0.00001;
134 tmp.Printf( "Float: %f\n", f );
135 textCtrl.WriteText( tmp );
136 file_output << f << "\n";
137 std_file_output << f << "\n";
138
139 wxString str( "Hello!" );
140 tmp.Printf( "String: %s\n", str.c_str() );
141 textCtrl.WriteText( tmp );
142 file_output << str << "\n";
143 std_file_output << str.c_str() << "\n";
144
145 textCtrl.WriteText( "\nReading from ifstream:\n" );
146
147 ifstream std_file_input( "test_std.dat" );
148
149 std_file_input >> si;
150 tmp.Printf( "Signed int: %d\n", si );
151 textCtrl.WriteText( tmp );
152
153 std_file_input >> ui;
154 tmp.Printf( "Unsigned int: %u\n", ui );
155 textCtrl.WriteText( tmp );
156
157 std_file_input >> d;
158 tmp.Printf( "Double: %f\n", d );
159 textCtrl.WriteText( tmp );
160
161 std_file_input >> f;
162 tmp.Printf( "Float: %f\n", f );
163 textCtrl.WriteText( tmp );
164
165 std_file_input >> str;
166 tmp.Printf( "String: %s\n", str.c_str() );
167 textCtrl.WriteText( tmp );
168
169 textCtrl.WriteText( "\nReading from wxFileInputStream:\n" );
170
171 wxFileInputStream file_input( "test_wx.dat" );
172
173 file_input >> si;
174 tmp.Printf( "Signed int: %d\n", si );
175 textCtrl.WriteText( tmp );
176
177 file_input >> ui;
178 tmp.Printf( "Unsigned int: %u\n", ui );
179 textCtrl.WriteText( tmp );
180
181 file_input >> d;
182 tmp.Printf( "Double: %f\n", d );
183 textCtrl.WriteText( tmp );
184
185 file_input >> f;
186 tmp.Printf( "Float: %f\n", f );
187 textCtrl.WriteText( tmp );
188
189 file_input >> str;
190 tmp.Printf( "String: %s\n", str.c_str() );
191 textCtrl.WriteText( tmp );
192 }
193
194 #if wxUSE_UNICODE
195 void MyApp::DoUnicodeDemo(wxCommandEvent& WXUNUSED(event))
196 {
197 wxTextCtrl& textCtrl = * GetTextCtrl();
198
199 textCtrl.Clear();
200 textCtrl << "\nTest wchar_t to char (Unicode to ANSI/Multibyte) converions:";
201
202 wxString str;
203 str = _T("Robert Röbling\n");
204
205 printf( "\n\nConversion with wxConvLocal:\n" );
206 wxConvCurrent = &wxConvLocal;
207 printf( (const char*) str.mbc_str() );
208
209 printf( "\n\nConversion with wxConvGdk:\n" );
210 wxConvCurrent = &wxConvGdk;
211 printf( (const char*) str.mbc_str() );
212
213 printf( "\n\nConversion with wxConvLibc:\n" );
214 wxConvCurrent = &wxConvLibc;
215 printf( (const char*) str.mbc_str() );
216
217 }
218 #endif
219
220 void MyApp::DoByteOrderDemo(wxCommandEvent& WXUNUSED(event))
221 {
222 wxTextCtrl& textCtrl = * GetTextCtrl();
223
224 textCtrl.Clear();
225 textCtrl << "\nTest byte order macros:\n\n";
226
227 if (wxBYTE_ORDER == wxLITTLE_ENDIAN)
228 textCtrl << "This is a little endian system.\n\n";
229 else
230 textCtrl << "This is a big endian system.\n\n";
231
232 wxString text;
233
234 wxInt32 var = 0xF1F2F3F4;
235 text = "";
236 text.Printf( _T("Value of wxInt32 is now: %#x.\n\n"), var );
237 textCtrl.WriteText( text );
238
239 text = "";
240 text.Printf( _T("Value of swapped wxInt32 is: %#x.\n\n"), wxINT32_SWAP_ALWAYS( var ) );
241 textCtrl.WriteText( text );
242
243 text = "";
244 text.Printf( _T("Value of wxInt32 swapped on little endian is: %#x.\n\n"), wxINT32_SWAP_ON_LE( var ) );
245 textCtrl.WriteText( text );
246
247 text = "";
248 text.Printf( _T("Value of wxInt32 swapped on big endian is: %#x.\n\n"), wxINT32_SWAP_ON_BE( var ) );
249 textCtrl.WriteText( text );
250 }
251
252 void MyApp::DoTimeDemo(wxCommandEvent& WXUNUSED(event))
253 {
254 wxTextCtrl& textCtrl = * GetTextCtrl();
255
256 textCtrl.Clear();
257 textCtrl << "\nTest class wxTime:\n";
258 wxTime now;
259 textCtrl << "It is now " << (wxString) now << "\n";
260 }
261
262 void MyApp::DoDateDemo(wxCommandEvent& WXUNUSED(event))
263 {
264 wxTextCtrl& textCtrl = * GetTextCtrl();
265
266 textCtrl.Clear();
267 textCtrl << "\nTest class wxDate" << "\n";
268
269 // Various versions of the constructors
270 // and various output
271
272 wxDate x(10,20,1962);
273
274 textCtrl << x.FormatDate(wxFULL) << " (full)\n";
275
276 // constuctor with a string, just printing the day of the week
277 wxDate y("8/8/1988");
278
279 textCtrl << y.FormatDate(wxDAY) << " (just day)\n";
280
281 // constructor with a julian
282 wxDate z( 2450000L );
283 textCtrl << z.FormatDate(wxFULL) << " (full)\n";
284
285 // using date addition and subtraction
286 wxDate a = x + 10;
287 textCtrl << a.FormatDate(wxFULL) << " (full)\n";
288 a = a - 25;
289 textCtrl << a.FormatDate(wxEUROPEAN) << " (European)\n";
290
291
292 // Using subtraction of two date objects
293 wxDate a1 = wxString("7/13/1991");
294 wxDate a2 = a1 + 14;
295 textCtrl << (a1-a2) << "\n";
296 textCtrl << (a2+=10) << "\n";
297
298 a1++;
299 textCtrl << "Tomorrow= " << a1.FormatDate(wxFULL) << "\n";
300
301 wxDate tmpDate1("08/01/1991");
302 wxDate tmpDate2("07/14/1991");
303 textCtrl << "a1 (7-14-91) < 8-01-91 ? ==> " << ((a1 < tmpDate1) ? "TRUE" : "FALSE") << "\n";
304 textCtrl << "a1 (7-14-91) > 8-01-91 ? ==> " << ((a1 > tmpDate1) ? "TRUE" : "FALSE") << "\n";
305 textCtrl << "a1 (7-14-91)== 7-14-91 ? ==> " << ((a1==tmpDate2) ? "TRUE" : "FALSE") << "\n";
306
307 wxDate a3 = a1;
308 textCtrl << "a1 (7-14-91)== a3 (7-14-91) ? ==> " << ((a1==a3) ? "TRUE" : "FALSE") << "\n";
309 wxDate a4 = a1;
310 textCtrl << "a1 (7-14-91)== a4 (7-15-91) ? ==> " << ((a1==++a4) ? "TRUE" : "FALSE") << "\n";
311
312 wxDate a5 = wxString("today");
313 textCtrl << "Today is: " << a5 << "\n";
314 a4 = "TODAY";
315 textCtrl << "Today (a4) is: " << a4 << "\n";
316
317 textCtrl << "Today + 4 is: " << (a4+=4) << "\n";
318 a4 = "TODAY";
319 textCtrl << "Today - 4 is: " << (a4-=4) << "\n";
320
321 textCtrl << "=========== Leap Year Test ===========\n";
322 a1 = "1/15/1992";
323 textCtrl << a1.FormatDate(wxFULL) << " " << ((a1.IsLeapYear()) ? "Leap" : "non-Leap");
324 textCtrl << " " << "day of year: " << a1.GetDayOfYear() << "\n";
325
326 a1 = "2/16/1993";
327 textCtrl << a1.FormatDate(wxFULL) << " " << ((a1.IsLeapYear()) ? "Leap" : "non-Leap");
328 textCtrl << " " << "day of year: " << a1.GetDayOfYear() << "\n";
329
330 textCtrl << "================== string assignment test ====================\n";
331 wxString date_string=a1;
332 textCtrl << "a1 as a string (s/b 2/16/1993) ==> " << date_string << "\n";
333
334 textCtrl << "================== SetFormat test ============================\n";
335 a1.SetFormat(wxFULL);
336 textCtrl << "a1 (s/b FULL format) ==> " << a1 << "\n";
337 a1.SetFormat(wxEUROPEAN);
338 textCtrl << "a1 (s/b EUROPEAN format) ==> " << a1 << "\n";
339
340 textCtrl << "================== SetOption test ============================\n";
341 textCtrl << "Date abbreviation ON\n";
342
343 a1.SetOption(wxDATE_ABBR);
344 a1.SetFormat(wxMONTH);
345 textCtrl << "a1 (s/b MONTH format) ==> " << a1 << "\n";
346 a1.SetFormat(wxDAY);
347 textCtrl << "a1 (s/b DAY format) ==> " << a1 << "\n";
348 a1.SetFormat(wxFULL);
349 textCtrl << "a1 (s/b FULL format) ==> " << a1 << "\n";
350 a1.SetFormat(wxEUROPEAN);
351 textCtrl << "a1 (s/b EUROPEAN format) ==> " << a1 << "\n";
352 textCtrl << "Century suppression ON\n";
353 a1.SetOption(wxNO_CENTURY);
354 a1.SetFormat(wxMDY);
355 textCtrl << "a1 (s/b MDY format) ==> " << a1 << "\n";
356 textCtrl << "Century suppression OFF\n";
357 a1.SetOption(wxNO_CENTURY,FALSE);
358 textCtrl << "a1 (s/b MDY format) ==> " << a1 << "\n";
359 textCtrl << "Century suppression ON\n";
360 a1.SetOption(wxNO_CENTURY);
361 textCtrl << "a1 (s/b MDY format) ==> " << a1 << "\n";
362 a1.SetFormat(wxFULL);
363 textCtrl << "a1 (s/b FULL format) ==> " << a1 << "\n";
364
365 textCtrl << "\n=============== Version 4.0 Enhancement Test =================\n";
366
367 wxDate v4("11/26/1966");
368 textCtrl << "\n---------- Set Stuff -----------\n";
369 textCtrl << "First, 'Set' to today..." << "\n";
370 textCtrl << "Before 'Set' => " << v4 << "\n";
371 textCtrl << "After 'Set' => " << v4.Set() << "\n\n";
372
373 textCtrl << "Set to 11/26/66 => " << v4.Set(11,26,1966) << "\n";
374 textCtrl << "Current Julian => " << v4.GetJulianDate() << "\n";
375 textCtrl << "Set to Julian 2450000L => " << v4.Set(2450000L) << "\n";
376 textCtrl << "See! => " << v4.GetJulianDate() << "\n";
377
378 textCtrl << "---------- Add Stuff -----------\n";
379 textCtrl << "Start => " << v4 << "\n";
380 textCtrl << "Add 4 Weeks => " << v4.AddWeeks(4) << "\n";
381 textCtrl << "Sub 1 Month => " << v4.AddMonths(-1) << "\n";
382 textCtrl << "Add 2 Years => " << v4.AddYears(2) << "\n";
383
384 textCtrl << "---------- Misc Stuff -----------\n";
385 textCtrl << "The date aboves' day of the month is => " << v4.GetDay() << "\n";
386 textCtrl << "There are " << v4.GetDaysInMonth() << " days in this month.\n";
387 textCtrl << "The first day of this month lands on " << v4.GetFirstDayOfMonth() << "\n";
388 textCtrl << "This day happens to be " << v4.GetDayOfWeekName() << "\n";
389 textCtrl << "the " << v4.GetDayOfWeek() << " day of the week," << "\n";
390 textCtrl << "on the " << v4.GetWeekOfYear() << " week of the year," << "\n";
391 textCtrl << "on the " << v4.GetWeekOfMonth() << " week of the month, " << "\n";
392 textCtrl << "(which is " << v4.GetMonthName() << ")\n";
393 textCtrl << "the "<< v4.GetMonth() << "th month in the year.\n";
394 textCtrl << "The year alone is " << v4.GetYear() << "\n";
395
396 textCtrl << "---------- First and Last Stuff -----------\n";
397 v4.Set();
398 textCtrl << "The first date of this month is " << v4.GetMonthStart() << "\n";
399 textCtrl << "The last date of this month is " << v4.GetMonthEnd() << "\n";
400 textCtrl << "The first date of this year is " << v4.GetYearStart() << "\n";
401 textCtrl << "The last date of this year is " << v4.GetYearEnd() << "\n";
402 }
403
404 void MyApp::DoVariantDemo(wxCommandEvent& WXUNUSED(event) )
405 {
406 wxTextCtrl& textCtrl = * GetTextCtrl();
407
408 wxVariant var1 = "String value";
409 textCtrl << "var1 = " << var1.MakeString() << "\n";
410
411 // Conversion
412 wxString str = var1.MakeString();
413
414 var1 = 123.456;
415 textCtrl << "var1 = " << var1.GetReal() << "\n";
416
417 // Implicit conversion
418 double v = var1;
419
420 var1 = 9876L;
421 textCtrl << "var1 = " << var1.GetLong() << "\n";
422
423 // Implicit conversion
424 long l = var1;
425
426 wxStringList stringList;
427 stringList.Add(_T("one")); stringList.Add(_T("two")); stringList.Add(_T("three"));
428 var1 = stringList;
429 textCtrl << "var1 = " << var1.MakeString() << "\n";
430
431 var1.ClearList();
432 var1.Append(wxVariant(1.2345));
433 var1.Append(wxVariant("hello"));
434 var1.Append(wxVariant(54321L));
435
436 textCtrl << "var1 = " << var1.MakeString() << "\n";
437
438 size_t n = var1.GetCount();
439 size_t i;
440 for (i = (size_t) 0; i < n; i++)
441 {
442 textCtrl << "var1[" << (int) i << "] (type " << var1[i].GetType() << ") = " << var1[i].MakeString() << "\n";
443 }
444 }
445
446 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
447 EVT_MENU(TYPES_QUIT, MyFrame::OnQuit)
448 EVT_MENU(TYPES_ABOUT, MyFrame::OnAbout)
449 END_EVENT_TABLE()
450
451 // My frame constructor
452 MyFrame::MyFrame(wxFrame *parent, const wxString& title,
453 const wxPoint& pos, const wxSize& size):
454 wxFrame(parent, -1, title, pos, size)
455 {}
456
457 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event) )
458 {
459 Close(TRUE);
460 }
461
462 void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
463 {
464 wxMessageDialog dialog(this, "Tests various wxWindows types",
465 "About Types", wxYES_NO|wxCANCEL);
466
467 dialog.ShowModal();
468 }
469
470