Don't report spurious errors from wxSocket in "no wait" mode.
[wxWidgets.git] / tests / image / image.cpp
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: tests/image/image.cpp
3 // Purpose: Test wxImage
4 // Author: Francesco Montorsi
5 // Created: 2009-05-31
6 // RCS-ID: $Id$
7 // Copyright: (c) 2009 Francesco Montorsi
8 // Licence: wxWindows licence
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 #endif // WX_PRECOMP
23
24 #include "wx/image.h"
25 #include "wx/url.h"
26 #include "wx/log.h"
27 #include "wx/mstream.h"
28 #include "wx/zstream.h"
29 #include "wx/wfstream.h"
30
31 struct testData {
32 const char* file;
33 wxBitmapType type;
34 } g_testfiles[] =
35 {
36 { "horse.ico", wxBITMAP_TYPE_ICO },
37 { "horse.xpm", wxBITMAP_TYPE_XPM },
38 { "horse.png", wxBITMAP_TYPE_PNG },
39 { "horse.ani", wxBITMAP_TYPE_ANI },
40 { "horse.bmp", wxBITMAP_TYPE_BMP },
41 { "horse.cur", wxBITMAP_TYPE_CUR },
42 { "horse.gif", wxBITMAP_TYPE_GIF },
43 { "horse.jpg", wxBITMAP_TYPE_JPEG },
44 { "horse.pcx", wxBITMAP_TYPE_PCX },
45 { "horse.pnm", wxBITMAP_TYPE_PNM },
46 { "horse.tga", wxBITMAP_TYPE_TGA },
47 { "horse.tif", wxBITMAP_TYPE_TIF }
48 };
49
50
51 // ----------------------------------------------------------------------------
52 // test class
53 // ----------------------------------------------------------------------------
54
55 class ImageTestCase : public CppUnit::TestCase
56 {
57 public:
58 ImageTestCase();
59 ~ImageTestCase();
60
61 private:
62 CPPUNIT_TEST_SUITE( ImageTestCase );
63 CPPUNIT_TEST( LoadFromSocketStream );
64 CPPUNIT_TEST( LoadFromZipStream );
65 CPPUNIT_TEST( LoadFromFile );
66 CPPUNIT_TEST( SizeImage );
67 CPPUNIT_TEST_SUITE_END();
68
69 void LoadFromSocketStream();
70 void LoadFromZipStream();
71 void LoadFromFile();
72 void SizeImage();
73
74 DECLARE_NO_COPY_CLASS(ImageTestCase)
75 };
76
77 CPPUNIT_TEST_SUITE_REGISTRATION( ImageTestCase );
78 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( ImageTestCase, "ImageTestCase" );
79
80 ImageTestCase::ImageTestCase()
81 {
82 wxSocketBase::Initialize();
83
84 // the formats we're going to test:
85 wxImage::AddHandler(new wxICOHandler);
86 wxImage::AddHandler(new wxXPMHandler);
87 wxImage::AddHandler(new wxPNGHandler);
88 wxImage::AddHandler(new wxANIHandler);
89 wxImage::AddHandler(new wxBMPHandler);
90 wxImage::AddHandler(new wxCURHandler);
91 wxImage::AddHandler(new wxGIFHandler);
92 wxImage::AddHandler(new wxJPEGHandler);
93 wxImage::AddHandler(new wxPCXHandler);
94 wxImage::AddHandler(new wxPNMHandler);
95 wxImage::AddHandler(new wxTGAHandler);
96 wxImage::AddHandler(new wxTIFFHandler);
97 }
98
99 ImageTestCase::~ImageTestCase()
100 {
101 wxSocketBase::Shutdown();
102 }
103
104 void ImageTestCase::LoadFromFile()
105 {
106 wxImage img;
107 for (unsigned int i=0; i<WXSIZEOF(g_testfiles); i++)
108 CPPUNIT_ASSERT(img.LoadFile(g_testfiles[i].file));
109 }
110
111 void ImageTestCase::LoadFromSocketStream()
112 {
113 if (!IsNetworkAvailable()) // implemented in test.cpp
114 {
115 wxLogWarning("No network connectivity; skipping the "
116 "ImageTestCase::LoadFromSocketStream test unit.");
117 return;
118 }
119
120 struct {
121 const char* url;
122 wxBitmapType type;
123 } testData[] =
124 {
125 { "http://www.wxwidgets.org/logo9.jpg", wxBITMAP_TYPE_JPEG },
126 { "http://www.wxwidgets.org/favicon.ico", wxBITMAP_TYPE_ICO }
127 };
128
129 for (unsigned int i=0; i<WXSIZEOF(testData); i++)
130 {
131 wxURL url(testData[i].url);
132 WX_ASSERT_EQUAL_MESSAGE
133 (
134 ("Constructing URL \"%s\" failed.", testData[i].url),
135 wxURL_NOERR,
136 url.GetError()
137 );
138
139 wxInputStream *in_stream = url.GetInputStream();
140 WX_ASSERT_MESSAGE
141 (
142 ("Opening URL \"%s\" failed.", testData[i].url),
143 in_stream && in_stream->IsOk()
144 );
145
146 wxImage img;
147
148 // NOTE: it's important to inform wxImage about the type of the image being
149 // loaded otherwise it will try to autodetect the format, but that
150 // requires a seekable stream!
151 WX_ASSERT_MESSAGE
152 (
153 ("Loading image from \"%s\" failed.", testData[i].url),
154 img.LoadFile(*in_stream, testData[i].type)
155 );
156
157 delete in_stream;
158 }
159 }
160
161 void ImageTestCase::LoadFromZipStream()
162 {
163 for (unsigned int i=0; i<WXSIZEOF(g_testfiles); i++)
164 {
165 switch (g_testfiles[i].type)
166 {
167 case wxBITMAP_TYPE_XPM:
168 case wxBITMAP_TYPE_GIF:
169 case wxBITMAP_TYPE_PCX:
170 case wxBITMAP_TYPE_TGA:
171 case wxBITMAP_TYPE_TIF:
172 continue; // skip testing those wxImageHandlers which cannot
173 // load data from non-seekable streams
174
175 default:
176 ; // proceed
177 }
178
179 // compress the test file on the fly:
180 wxMemoryOutputStream memOut;
181 {
182 wxFileInputStream file(g_testfiles[i].file);
183 CPPUNIT_ASSERT(file.IsOk());
184
185 wxZlibOutputStream compressFilter(memOut, 5, wxZLIB_GZIP);
186 CPPUNIT_ASSERT(compressFilter.IsOk());
187
188 file.Read(compressFilter);
189 CPPUNIT_ASSERT(file.GetLastError() == wxSTREAM_EOF);
190 }
191
192 // now fetch the compressed memory to wxImage, decompressing it on the fly; this
193 // allows us to test loading images from non-seekable streams other than socket streams
194 wxMemoryInputStream memIn(memOut);
195 CPPUNIT_ASSERT(memIn.IsOk());
196 wxZlibInputStream decompressFilter(memIn, wxZLIB_GZIP);
197 CPPUNIT_ASSERT(decompressFilter.IsOk());
198
199 wxImage img;
200
201 // NOTE: it's important to inform wxImage about the type of the image being
202 // loaded otherwise it will try to autodetect the format, but that
203 // requires a seekable stream!
204 WX_ASSERT_MESSAGE(("Could not load file type '%d' after it was zipped", g_testfiles[i].type),
205 img.LoadFile(decompressFilter, g_testfiles[i].type));
206 }
207 }
208
209 void ImageTestCase::SizeImage()
210 {
211 // Test the wxImage::Size() function which takes a rectangle from source and
212 // places it in a new image at a given position. This test checks, if the
213 // correct areas are chosen, and clipping is done correctly.
214
215 // our test image:
216 static const char * xpm_orig[] = {
217 "10 10 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
218 " .....",
219 " ++++@@@@.",
220 " +... @.",
221 " +.@@++ @.",
222 " +.@ .+ @.",
223 ".@ +. @.+ ",
224 ".@ ++@@.+ ",
225 ".@ ...+ ",
226 ".@@@@++++ ",
227 "..... "
228 };
229 // the expected results for all tests:
230 static const char * xpm_l_t[] = {
231 "10 10 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
232 "... @.BB",
233 ".@@++ @.BB",
234 ".@ .+ @.BB",
235 " +. @.+ BB",
236 " ++@@.+ BB",
237 " ...+ BB",
238 "@@@++++ BB",
239 "... BB",
240 "BBBBBBBBBB",
241 "BBBBBBBBBB"
242 };
243 static const char * xpm_t[] = {
244 "10 10 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
245 " +... @.",
246 " +.@@++ @.",
247 " +.@ .+ @.",
248 ".@ +. @.+ ",
249 ".@ ++@@.+ ",
250 ".@ ...+ ",
251 ".@@@@++++ ",
252 "..... ",
253 "BBBBBBBBBB",
254 "BBBBBBBBBB"
255 };
256 static const char * xpm_r_t[] = {
257 "10 10 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
258 "BB +... ",
259 "BB +.@@++ ",
260 "BB +.@ .+ ",
261 "BB.@ +. @.",
262 "BB.@ ++@@.",
263 "BB.@ ...",
264 "BB.@@@@+++",
265 "BB..... ",
266 "BBBBBBBBBB",
267 "BBBBBBBBBB"
268 };
269 static const char * xpm_l[] = {
270 "10 10 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
271 " .....BB",
272 "+++@@@@.BB",
273 "... @.BB",
274 ".@@++ @.BB",
275 ".@ .+ @.BB",
276 " +. @.+ BB",
277 " ++@@.+ BB",
278 " ...+ BB",
279 "@@@++++ BB",
280 "... BB"
281 };
282 static const char * xpm_r[] = {
283 "10 10 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
284 "BB ...",
285 "BB ++++@@@",
286 "BB +... ",
287 "BB +.@@++ ",
288 "BB +.@ .+ ",
289 "BB.@ +. @.",
290 "BB.@ ++@@.",
291 "BB.@ ...",
292 "BB.@@@@+++",
293 "BB..... "
294 };
295 static const char * xpm_l_b[] = {
296 "10 10 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
297 "BBBBBBBBBB",
298 "BBBBBBBBBB",
299 " .....BB",
300 "+++@@@@.BB",
301 "... @.BB",
302 ".@@++ @.BB",
303 ".@ .+ @.BB",
304 " +. @.+ BB",
305 " ++@@.+ BB",
306 " ...+ BB"
307 };
308 static const char * xpm_b[] = {
309 "10 10 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
310 "BBBBBBBBBB",
311 "BBBBBBBBBB",
312 " .....",
313 " ++++@@@@.",
314 " +... @.",
315 " +.@@++ @.",
316 " +.@ .+ @.",
317 ".@ +. @.+ ",
318 ".@ ++@@.+ ",
319 ".@ ...+ "
320 };
321 static const char * xpm_r_b[] = {
322 "10 10 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
323 "BBBBBBBBBB",
324 "BBBBBBBBBB",
325 "BB ...",
326 "BB ++++@@@",
327 "BB +... ",
328 "BB +.@@++ ",
329 "BB +.@ .+ ",
330 "BB.@ +. @.",
331 "BB.@ ++@@.",
332 "BB.@ ..."
333 };
334 static const char * xpm_sm[] = {
335 "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
336 " .....",
337 " ++++@@@",
338 " +... ",
339 " +.@@++ ",
340 " +.@ .+ ",
341 ".@ +. @.",
342 ".@ ++@@.",
343 ".@ ..."
344 };
345 static const char * xpm_gt[] = {
346 "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
347 " .....BB",
348 " ++++@@@@.BB",
349 " +... @.BB",
350 " +.@@++ @.BB",
351 " +.@ .+ @.BB",
352 ".@ +. @.+ BB",
353 ".@ ++@@.+ BB",
354 ".@ ...+ BB",
355 ".@@@@++++ BB",
356 "..... BB",
357 "BBBBBBBBBBBB",
358 "BBBBBBBBBBBB"
359 };
360 static const char * xpm_gt_l_t[] = {
361 "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
362 "... @.BBBB",
363 ".@@++ @.BBBB",
364 ".@ .+ @.BBBB",
365 " +. @.+ BBBB",
366 " ++@@.+ BBBB",
367 " ...+ BBBB",
368 "@@@++++ BBBB",
369 "... BBBB",
370 "BBBBBBBBBBBB",
371 "BBBBBBBBBBBB",
372 "BBBBBBBBBBBB",
373 "BBBBBBBBBBBB"
374 };
375 static const char * xpm_gt_l[] = {
376 "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
377 " .....BBBB",
378 "+++@@@@.BBBB",
379 "... @.BBBB",
380 ".@@++ @.BBBB",
381 ".@ .+ @.BBBB",
382 " +. @.+ BBBB",
383 " ++@@.+ BBBB",
384 " ...+ BBBB",
385 "@@@++++ BBBB",
386 "... BBBB",
387 "BBBBBBBBBBBB",
388 "BBBBBBBBBBBB"
389 };
390 static const char * xpm_gt_l_b[] = {
391 "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
392 "BBBBBBBBBBBB",
393 "BBBBBBBBBBBB",
394 " .....BBBB",
395 "+++@@@@.BBBB",
396 "... @.BBBB",
397 ".@@++ @.BBBB",
398 ".@ .+ @.BBBB",
399 " +. @.+ BBBB",
400 " ++@@.+ BBBB",
401 " ...+ BBBB",
402 "@@@++++ BBBB",
403 "... BBBB"
404 };
405 static const char * xpm_gt_l_bb[] = {
406 "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
407 "BBBBBBBBBBBB",
408 "BBBBBBBBBBBB",
409 "BBBBBBBBBBBB",
410 "BBBBBBBBBBBB",
411 " .....BBBB",
412 "+++@@@@.BBBB",
413 "... @.BBBB",
414 ".@@++ @.BBBB",
415 ".@ .+ @.BBBB",
416 " +. @.+ BBBB",
417 " ++@@.+ BBBB",
418 " ...+ BBBB"
419 };
420 static const char * xpm_gt_t[] = {
421 "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
422 " +... @.BB",
423 " +.@@++ @.BB",
424 " +.@ .+ @.BB",
425 ".@ +. @.+ BB",
426 ".@ ++@@.+ BB",
427 ".@ ...+ BB",
428 ".@@@@++++ BB",
429 "..... BB",
430 "BBBBBBBBBBBB",
431 "BBBBBBBBBBBB",
432 "BBBBBBBBBBBB",
433 "BBBBBBBBBBBB"
434 };
435 static const char * xpm_gt_b[] = {
436 "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
437 "BBBBBBBBBBBB",
438 "BBBBBBBBBBBB",
439 " .....BB",
440 " ++++@@@@.BB",
441 " +... @.BB",
442 " +.@@++ @.BB",
443 " +.@ .+ @.BB",
444 ".@ +. @.+ BB",
445 ".@ ++@@.+ BB",
446 ".@ ...+ BB",
447 ".@@@@++++ BB",
448 "..... BB"
449 };
450 static const char * xpm_gt_bb[] = {
451 "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
452 "BBBBBBBBBBBB",
453 "BBBBBBBBBBBB",
454 "BBBBBBBBBBBB",
455 "BBBBBBBBBBBB",
456 " .....BB",
457 " ++++@@@@.BB",
458 " +... @.BB",
459 " +.@@++ @.BB",
460 " +.@ .+ @.BB",
461 ".@ +. @.+ BB",
462 ".@ ++@@.+ BB",
463 ".@ ...+ BB"
464 };
465 static const char * xpm_gt_r_t[] = {
466 "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
467 "BB +... @.",
468 "BB +.@@++ @.",
469 "BB +.@ .+ @.",
470 "BB.@ +. @.+ ",
471 "BB.@ ++@@.+ ",
472 "BB.@ ...+ ",
473 "BB.@@@@++++ ",
474 "BB..... ",
475 "BBBBBBBBBBBB",
476 "BBBBBBBBBBBB",
477 "BBBBBBBBBBBB",
478 "BBBBBBBBBBBB"
479 };
480 static const char * xpm_gt_r[] = {
481 "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
482 "BB .....",
483 "BB ++++@@@@.",
484 "BB +... @.",
485 "BB +.@@++ @.",
486 "BB +.@ .+ @.",
487 "BB.@ +. @.+ ",
488 "BB.@ ++@@.+ ",
489 "BB.@ ...+ ",
490 "BB.@@@@++++ ",
491 "BB..... ",
492 "BBBBBBBBBBBB",
493 "BBBBBBBBBBBB"
494 };
495 static const char * xpm_gt_r_b[] = {
496 "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
497 "BBBBBBBBBBBB",
498 "BBBBBBBBBBBB",
499 "BB .....",
500 "BB ++++@@@@.",
501 "BB +... @.",
502 "BB +.@@++ @.",
503 "BB +.@ .+ @.",
504 "BB.@ +. @.+ ",
505 "BB.@ ++@@.+ ",
506 "BB.@ ...+ ",
507 "BB.@@@@++++ ",
508 "BB..... "
509 };
510 static const char * xpm_gt_r_bb[] = {
511 "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
512 "BBBBBBBBBBBB",
513 "BBBBBBBBBBBB",
514 "BBBBBBBBBBBB",
515 "BBBBBBBBBBBB",
516 "BB .....",
517 "BB ++++@@@@.",
518 "BB +... @.",
519 "BB +.@@++ @.",
520 "BB +.@ .+ @.",
521 "BB.@ +. @.+ ",
522 "BB.@ ++@@.+ ",
523 "BB.@ ...+ "
524 };
525 static const char * xpm_gt_rr_t[] = {
526 "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
527 "BBBB +... ",
528 "BBBB +.@@++ ",
529 "BBBB +.@ .+ ",
530 "BBBB.@ +. @.",
531 "BBBB.@ ++@@.",
532 "BBBB.@ ...",
533 "BBBB.@@@@+++",
534 "BBBB..... ",
535 "BBBBBBBBBBBB",
536 "BBBBBBBBBBBB",
537 "BBBBBBBBBBBB",
538 "BBBBBBBBBBBB"
539 };
540 static const char * xpm_gt_rr[] = {
541 "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
542 "BBBB ...",
543 "BBBB ++++@@@",
544 "BBBB +... ",
545 "BBBB +.@@++ ",
546 "BBBB +.@ .+ ",
547 "BBBB.@ +. @.",
548 "BBBB.@ ++@@.",
549 "BBBB.@ ...",
550 "BBBB.@@@@+++",
551 "BBBB..... ",
552 "BBBBBBBBBBBB",
553 "BBBBBBBBBBBB"
554 };
555 static const char * xpm_gt_rr_b[] = {
556 "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
557 "BBBBBBBBBBBB",
558 "BBBBBBBBBBBB",
559 "BBBB ...",
560 "BBBB ++++@@@",
561 "BBBB +... ",
562 "BBBB +.@@++ ",
563 "BBBB +.@ .+ ",
564 "BBBB.@ +. @.",
565 "BBBB.@ ++@@.",
566 "BBBB.@ ...",
567 "BBBB.@@@@+++",
568 "BBBB..... "
569 };
570 static const char * xpm_gt_rr_bb[] = {
571 "12 12 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
572 "BBBBBBBBBBBB",
573 "BBBBBBBBBBBB",
574 "BBBBBBBBBBBB",
575 "BBBBBBBBBBBB",
576 "BBBB ...",
577 "BBBB ++++@@@",
578 "BBBB +... ",
579 "BBBB +.@@++ ",
580 "BBBB +.@ .+ ",
581 "BBBB.@ +. @.",
582 "BBBB.@ ++@@.",
583 "BBBB.@ ..."
584 };
585 static const char * xpm_sm_ll_tt[] = {
586 "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
587 " .+ @.BB",
588 ". @.+ BB",
589 "+@@.+ BB",
590 " ...+ BB",
591 "@++++ BB",
592 ". BB",
593 "BBBBBBBB",
594 "BBBBBBBB"
595 };
596 static const char * xpm_sm_ll_t[] = {
597 "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
598 ". @.BB",
599 "@++ @.BB",
600 " .+ @.BB",
601 ". @.+ BB",
602 "+@@.+ BB",
603 " ...+ BB",
604 "@++++ BB",
605 ". BB"
606 };
607 static const char * xpm_sm_ll[] = {
608 "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
609 " .....BB",
610 "+@@@@.BB",
611 ". @.BB",
612 "@++ @.BB",
613 " .+ @.BB",
614 ". @.+ BB",
615 "+@@.+ BB",
616 " ...+ BB"
617 };
618 static const char * xpm_sm_ll_b[] = {
619 "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
620 "BBBBBBBB",
621 "BBBBBBBB",
622 " .....BB",
623 "+@@@@.BB",
624 ". @.BB",
625 "@++ @.BB",
626 " .+ @.BB",
627 ". @.+ BB"
628 };
629 static const char * xpm_sm_l_tt[] = {
630 "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
631 ".@ .+ @.",
632 " +. @.+ ",
633 " ++@@.+ ",
634 " ...+ ",
635 "@@@++++ ",
636 "... ",
637 "BBBBBBBB",
638 "BBBBBBBB"
639 };
640 static const char * xpm_sm_l_t[] = {
641 "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
642 "... @.",
643 ".@@++ @.",
644 ".@ .+ @.",
645 " +. @.+ ",
646 " ++@@.+ ",
647 " ...+ ",
648 "@@@++++ ",
649 "... "
650 };
651 static const char * xpm_sm_l[] = {
652 "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
653 " .....",
654 "+++@@@@.",
655 "... @.",
656 ".@@++ @.",
657 ".@ .+ @.",
658 " +. @.+ ",
659 " ++@@.+ ",
660 " ...+ "
661 };
662 static const char * xpm_sm_l_b[] = {
663 "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
664 "BBBBBBBB",
665 "BBBBBBBB",
666 " .....",
667 "+++@@@@.",
668 "... @.",
669 ".@@++ @.",
670 ".@ .+ @.",
671 " +. @.+ "
672 };
673 static const char * xpm_sm_tt[] = {
674 "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
675 " +.@ .+ ",
676 ".@ +. @.",
677 ".@ ++@@.",
678 ".@ ...",
679 ".@@@@+++",
680 "..... ",
681 "BBBBBBBB",
682 "BBBBBBBB"
683 };
684 static const char * xpm_sm_t[] = {
685 "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
686 " +... ",
687 " +.@@++ ",
688 " +.@ .+ ",
689 ".@ +. @.",
690 ".@ ++@@.",
691 ".@ ...",
692 ".@@@@+++",
693 "..... "
694 };
695 static const char * xpm_sm_b[] = {
696 "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
697 "BBBBBBBB",
698 "BBBBBBBB",
699 " ...",
700 " ++++@@@",
701 " +... ",
702 " +.@@++ ",
703 " +.@ .+ ",
704 ".@ +. @."
705 };
706 static const char * xpm_sm_r_tt[] = {
707 "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
708 "BB +.@ .",
709 "BB.@ +. ",
710 "BB.@ ++@",
711 "BB.@ .",
712 "BB.@@@@+",
713 "BB..... ",
714 "BBBBBBBB",
715 "BBBBBBBB"
716 };
717 static const char * xpm_sm_r_t[] = {
718 "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
719 "BB +... ",
720 "BB +.@@+",
721 "BB +.@ .",
722 "BB.@ +. ",
723 "BB.@ ++@",
724 "BB.@ .",
725 "BB.@@@@+",
726 "BB..... "
727 };
728 static const char * xpm_sm_r[] = {
729 "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
730 "BB .",
731 "BB ++++@",
732 "BB +... ",
733 "BB +.@@+",
734 "BB +.@ .",
735 "BB.@ +. ",
736 "BB.@ ++@",
737 "BB.@ ."
738 };
739 static const char * xpm_sm_r_b[] = {
740 "8 8 5 1", "B c Black", " c #00ff00", ". c #0000ff", "+ c #7f7f7f", "@ c #FF0000",
741 "BBBBBBBB",
742 "BBBBBBBB",
743 "BB .",
744 "BB ++++@",
745 "BB +... ",
746 "BB +.@@+",
747 "BB +.@ .",
748 "BB.@ +. "
749 };
750
751 // this table defines all tests
752 struct SizeTestData
753 {
754 int w, h, dx, dy; // first parameters for Size()
755 const char **ref_xpm; // expected result
756 } sizeTestData[] =
757 {
758 { 10, 10, 0, 0, xpm_orig}, // same size, same position
759 { 12, 12, 0, 0, xpm_gt}, // target larger, same position
760 { 8, 8, 0, 0, xpm_sm}, // target smaller, same position
761 { 10, 10, -2, -2, xpm_l_t}, // same size, move left up
762 { 10, 10, -2, 0, xpm_l}, // same size, move left
763 { 10, 10, -2, 2, xpm_l_b}, // same size, move left down
764 { 10, 10, 0, -2, xpm_t}, // same size, move up
765 { 10, 10, 0, 2, xpm_b}, // same size, move down
766 { 10, 10, 2, -2, xpm_r_t}, // same size, move right up
767 { 10, 10, 2, 0, xpm_r}, // same size, move right
768 { 10, 10, 2, 2, xpm_r_b}, // same size, move right down
769 { 12, 12, -2, -2, xpm_gt_l_t}, // target larger, move left up
770 { 12, 12, -2, 0, xpm_gt_l}, // target larger, move left
771 { 12, 12, -2, 2, xpm_gt_l_b}, // target larger, move left down
772 { 12, 12, -2, 4, xpm_gt_l_bb}, // target larger, move left down
773 { 12, 12, 0, -2, xpm_gt_t}, // target larger, move up
774 { 12, 12, 0, 2, xpm_gt_b}, // target larger, move down
775 { 12, 12, 0, 4, xpm_gt_bb}, // target larger, move down
776 { 12, 12, 2, -2, xpm_gt_r_t}, // target larger, move right up
777 { 12, 12, 2, 0, xpm_gt_r}, // target larger, move right
778 { 12, 12, 2, 2, xpm_gt_r_b}, // target larger, move right down
779 { 12, 12, 2, 4, xpm_gt_r_bb}, // target larger, move right down
780 { 12, 12, 4, -2, xpm_gt_rr_t}, // target larger, move right up
781 { 12, 12, 4, 0, xpm_gt_rr}, // target larger, move right
782 { 12, 12, 4, 2, xpm_gt_rr_b}, // target larger, move right down
783 { 12, 12, 4, 4, xpm_gt_rr_bb}, // target larger, move right down
784 { 8, 8, -4, -4, xpm_sm_ll_tt}, // target smaller, move left up
785 { 8, 8, -4, -2, xpm_sm_ll_t}, // target smaller, move left up
786 { 8, 8, -4, 0, xpm_sm_ll}, // target smaller, move left
787 { 8, 8, -4, 2, xpm_sm_ll_b}, // target smaller, move left down
788 { 8, 8, -2, -4, xpm_sm_l_tt}, // target smaller, move left up
789 { 8, 8, -2, -2, xpm_sm_l_t}, // target smaller, move left up
790 { 8, 8, -2, 0, xpm_sm_l}, // target smaller, move left
791 { 8, 8, -2, 2, xpm_sm_l_b}, // target smaller, move left down
792 { 8, 8, 0, -4, xpm_sm_tt}, // target smaller, move up
793 { 8, 8, 0, -2, xpm_sm_t}, // target smaller, move up
794 { 8, 8, 0, 2, xpm_sm_b}, // target smaller, move down
795 { 8, 8, 2, -4, xpm_sm_r_tt}, // target smaller, move right up
796 { 8, 8, 2, -2, xpm_sm_r_t}, // target smaller, move right up
797 { 8, 8, 2, 0, xpm_sm_r}, // target smaller, move right
798 { 8, 8, 2, 2, xpm_sm_r_b}, // target smaller, move right down
799 };
800
801 const wxImage src_img(xpm_orig);
802 for ( unsigned i = 0; i < WXSIZEOF(sizeTestData); i++ )
803 {
804 SizeTestData& st = sizeTestData[i];
805 wxImage
806 actual(src_img.Size(wxSize(st.w, st.h), wxPoint(st.dx, st.dy), 0, 0, 0)),
807 expected(st.ref_xpm);
808
809 // to check results with an image viewer uncomment this:
810 //actual.SaveFile(wxString::Format("imagetest-%02d-actual.png", i), wxBITMAP_TYPE_PNG);
811 //expected.SaveFile(wxString::Format("imagetest-%02d-exp.png", i), wxBITMAP_TYPE_PNG);
812
813 CPPUNIT_ASSERT_EQUAL( actual.GetSize().x, expected.GetSize().x );
814 CPPUNIT_ASSERT_EQUAL( actual.GetSize().y, expected.GetSize().y );
815
816 const unsigned data_len = 3 * expected.GetHeight() * expected.GetWidth();
817
818 WX_ASSERT_MESSAGE
819 (
820 ("Resize test #%u: (%d, %d), (%d, %d)", i, st.w, st.h, st.dx, st.dy),
821 memcmp(actual.GetData(), expected.GetData(), data_len) == 0
822 );
823 }
824 }
825
826
827 /*
828 TODO: add lots of more tests to wxImage functions
829 */