]> git.saurik.com Git - wxWidgets.git/blame - tests/lltest.cpp
Decided I need copy and assignment afterall
[wxWidgets.git] / tests / lltest.cpp
CommitLineData
162b0c3b
VZ
1#include "wx/wxprec.h"
2
ef58b382
VZ
3#include "wx/longlong.h"
4
5#include <time.h>
6#include <stdlib.h>
7#if defined(__MWERKS__) && macintosh
8#include <SIOUX.h>
9#include <Events.h>
10#endif
11
162b0c3b 12static const unsigned wxLongLong_t NumberOfTests = 100000l;
ef58b382
VZ
13
14//using namespace std;
15int oddbits(unsigned int number);
16
17int oddbits(unsigned int number)
18{
19 int sum = 0;
20 while(number > 0)
21 {
22 sum += number & 1;
23 number >>= 1;
24 }
25
26 return sum & 1;
27}
28void random(long& hi, unsigned long& lo);
29
30void random(long& hi, unsigned long& lo)
31{
32 hi = 0;
33 lo = 0;
34
35 for (int i = 0; i < 32; i++)
36 {
37 hi |= oddbits(rand()) << i;
38 lo |= oddbits(rand()) << i;
39 }
40}
41
42int shifttest();
43
44int shifttest()
45{
162b0c3b 46 cout << endl << "Starting shift tests." << endl;
ef58b382
VZ
47
48 long hi = 0;
49 unsigned long lo = 0;
50
51 unsigned wxLongLong_t counter = 0;
52
53 while (counter < NumberOfTests)
54 {
55 if ((counter % 1000) == 999)
56 {
162b0c3b 57 cerr << "+";
ef58b382
VZ
58#if defined(__MWERKS__) && macintosh
59 GetNextEvent(0, NULL);
60#endif
61 }
62
63 random(hi, lo);
64 wxLongLongWx l1a(hi, lo);
65 wxLongLongWx l1c(hi, lo);
66 wxLongLongWx l1b;
67 wxLongLongNative l2a(hi, lo);
68 wxLongLongNative l2c(hi, lo);
69 wxLongLongNative l2b;
70
71 int shift = rand() % 64;
72 int leftshift = oddbits(rand());
73
74 if (leftshift)
75 {
76 l1b = l1a << shift;
77 l2b = l2a << shift;
78 l1c <<= shift;
79 l2c <<= shift;
80 }
81 else
82 {
83 l1b = l1a >> shift;
84 l2b = l2a >> shift;
85 l1c >>= shift;
86 l2c >>= shift;
87 }
88
89 void *oneb = l1b.asArray();
90 void *twob = l2b.asArray();
91 void *onec = l1c.asArray();
92 void *twoc = l2c.asArray();
93
94 if ((memcmp(oneb, twob, 8) != 0) || (memcmp(onec, twoc, 8) != 0) || (memcmp(oneb, onec, 8) != 0))
95 {
162b0c3b
VZ
96 cout << endl << "After " << wxLongLongNative(counter) << " successful trials: " << endl;
97 cout << l1a << endl;
98 cout << l2a << endl;
ef58b382 99 if (leftshift)
162b0c3b 100 cout << "<< ";
ef58b382 101 else
162b0c3b
VZ
102 cout << ">> ";
103 cout << shift << endl;
104 cout << l1b << endl;
105 cout << l2b << endl;
106 cout << l1c << endl;
107 cout << l2c << endl;
ef58b382
VZ
108 return 0;
109 }
110 counter++;
111 }
112
162b0c3b 113 cout << endl << wxLongLongNative(counter) << " successful trial" << (counter == 1 ? "." : "s.") << endl;
ef58b382
VZ
114
115 return 1;
116}
117
118int add1test();
119
120int add1test()
121{
162b0c3b 122 cout << endl << "Starting first addition tests." << endl;
ef58b382
VZ
123
124 long hi = 0;
125 unsigned long lo = 0;
126
127 unsigned wxLongLong_t counter = 0;
128
129 while (counter < NumberOfTests)
130 {
131 if ((counter % 1000) == 999)
132 {
162b0c3b 133 cerr << "+";
ef58b382
VZ
134#if defined(__MWERKS__) && macintosh
135 GetNextEvent(0, NULL);
136#endif
137 }
138
139 random(hi, lo);
140 wxLongLongWx l1a(hi, lo);
141 wxLongLongNative l2a(hi, lo);
142 wxLongLongWx l1d(hi, lo);
143 wxLongLongNative l2d(hi, lo);
144 random(hi, lo);
145 wxLongLongWx l1b(hi, lo);
146 wxLongLongNative l2b(hi, lo);
147 wxLongLongWx l1c;
148 wxLongLongNative l2c;
149
150 l1c = l1a + l1b;
151 l2c = l2a + l2b;
152 l1d += l1b;
153 l2d += l2b;
154
155 void *onec = l1c.asArray();
156 void *twoc = l2c.asArray();
157 void *oned = l1d.asArray();
158 void *twod = l2d.asArray();
159
160 if ((memcmp(onec, twoc, 8) != 0) || (memcmp(oned, twod, 8) != 0) || (memcmp(onec, oned, 8) != 0))
161 {
162b0c3b
VZ
162 cout << endl << "After " << wxLongLongNative(counter) << " successful trials: " << endl;
163 cout << l1a << endl;
164 cout << l2a << endl;
165 cout << l1b << endl;
166 cout << l2b << endl;
167 cout << l1c << endl;
168 cout << l2c << endl;
ef58b382
VZ
169 return 0;
170 }
171 counter++;
172 }
173
162b0c3b 174 cout << endl << wxLongLongNative(counter) << " successful trial" << (counter == 1 ? "." : "s.") << endl;
ef58b382
VZ
175
176 return 1;
177}
178
179/*
180int add2test();
181
182int add2test()
183{
162b0c3b 184 cout << endl << "Starting second addition tests." << endl;
ef58b382
VZ
185
186 long hi = 0;
187 unsigned long lo = 0;
188
189 unsigned wxLongLong_t counter = 0;
190
191 while (counter < NumberOfTests)
192 {
193 if ((counter % 1000) == 999)
194 {
162b0c3b 195 cerr << "+";
ef58b382
VZ
196#if defined(__MWERKS__) && macintosh
197 GetNextEvent(0, NULL);
198#endif
199 }
200
201 random(hi, lo);
202 wxLongLongWx l1a(hi, lo);
203 wxLongLongNative l2a(hi, lo);
204 wxLongLongWx l1c(hi, lo);
205 wxLongLongNative l2c(hi, lo);
206 random(hi, lo);
207 wxLongLongWx l1b(hi, lo);
208 wxLongLongNative l2b(hi, lo);
209
210 l1b += l1a;
211 l2b += l2a;
212
213 void *one = l1b.asArray();
214 void *two = l2b.asArray();
215
216 if (memcmp(one, two, 8) != 0)
217 {
162b0c3b
VZ
218 cout << endl << "After " << counter << " successful trials: " << endl;
219 cout << l1c << endl;
220 cout << l2c << endl;
221 cout << l1a << endl;
222 cout << l2a << endl;
223 cout << l1b << endl;
224 cout << l2b << endl;
ef58b382
VZ
225 return 0;
226 }
227 counter++;
228 }
229
162b0c3b 230 cout << endl << counter << " successful trial" << (counter == 1 ? "." : "s.") << endl;
ef58b382
VZ
231
232 return 1;
233}
234*/
235
236int sub1test();
237
238int sub1test()
239{
162b0c3b 240 cout << endl << "Starting first subtraction tests." << endl;
ef58b382
VZ
241
242 long hi = 0;
243 unsigned long lo = 0;
244
245 unsigned wxLongLong_t counter = 0;
246
247 while (counter < NumberOfTests)
248 {
249 if ((counter % 1000) == 999)
250 {
162b0c3b 251 cerr << "+";
ef58b382
VZ
252#if defined(__MWERKS__) && macintosh
253 GetNextEvent(0, NULL);
254#endif
255 }
256
257 random(hi, lo);
258 wxLongLongWx l1a(hi, lo);
259 wxLongLongNative l2a(hi, lo);
260 wxLongLongWx l1d(hi, lo);
261 wxLongLongNative l2d(hi, lo);
262 random(hi, lo);
263 wxLongLongWx l1b(hi, lo);
264 wxLongLongNative l2b(hi, lo);
265 wxLongLongWx l1c;
266 wxLongLongNative l2c;
267
268 l1c = l1a - l1b;
269 l2c = l2a - l2b;
270 l1d -= l1b;
271 l2d -= l2b;
272
273 void *onec = l1c.asArray();
274 void *twoc = l2c.asArray();
275 void *oned = l1d.asArray();
276 void *twod = l2d.asArray();
277
278 if ((memcmp(onec, twoc, 8) != 0) || (memcmp(oned, twod, 8) != 0) || (memcmp(onec, oned, 8) != 0))
279 {
162b0c3b
VZ
280 cout << endl << "After " << wxLongLongNative(counter) << " successful trials: " << endl;
281 cout << l1a << endl;
282 cout << l2a << endl;
283 cout << l1b << endl;
284 cout << l2b << endl;
285 cout << l1c << endl;
286 cout << l2c << endl;
287 cout << l1d << endl;
288 cout << l2d << endl;
ef58b382
VZ
289 return 0;
290 }
291 counter++;
292 }
293
162b0c3b 294 cout << endl << wxLongLongNative(counter) << " successful trial" << (counter == 1 ? "." : "s.") << endl;
ef58b382
VZ
295
296 return 1;
297}
298
299/*
300int sub2test();
301
302int sub2test()
303{
162b0c3b 304 cout << endl << "Starting second subtraction tests." << endl;
ef58b382
VZ
305
306 long hi = 0;
307 unsigned long lo = 0;
308
309 unsigned wxLongLong_t counter = 0;
310
311 while (counter < NumberOfTests)
312 {
313 if ((counter % 1000) == 999)
314 {
162b0c3b 315 cerr << "+";
ef58b382
VZ
316#if defined(__MWERKS__) && macintosh
317 GetNextEvent(0, NULL);
318#endif
319 }
320
321 random(hi, lo);
322 wxLongLongWx l1a(hi, lo);
323 wxLongLongNative l2a(hi, lo);
324 wxLongLongWx l1c(hi, lo);
325 wxLongLongNative l2c(hi, lo);
326 random(hi, lo);
327 wxLongLongWx l1b(hi, lo);
328 wxLongLongNative l2b(hi, lo);
329
330 l1b -= l1a;
331 l2b -= l2a;
332
333 void *one = l1b.asArray();
334 void *two = l2b.asArray();
335
336 if (memcmp(one, two, 8) != 0)
337 {
162b0c3b
VZ
338 cout << endl << "After " << counter << " successful trials: " << endl;
339 cout << l1c << endl;
340 cout << l2c << endl;
341 cout << l1a << endl;
342 cout << l2a << endl;
343 cout << l1b << endl;
344 cout << l2b << endl;
ef58b382
VZ
345 return 0;
346 }
347 counter++;
348 }
349
162b0c3b 350 cout << endl << counter << " successful trial" << (counter == 1 ? "." : "s.") << endl;
ef58b382
VZ
351
352 return 1;
353}
354
355*/
356
357int incdectest();
358
359int incdectest()
360{
162b0c3b 361 cout << endl << "Starting pre/post increment/decrement tests." << endl;
ef58b382
VZ
362
363 long hi = 0;
364 unsigned long lo = 0;
365
366 unsigned wxLongLong_t counter = 0;
367
368 while (counter < NumberOfTests)
369 {
370 if ((counter % 1000) == 999)
371 {
162b0c3b 372 cerr << "+";
ef58b382
VZ
373#if defined(__MWERKS__) && macintosh
374 GetNextEvent(0, NULL);
375#endif
376 }
377
378 random(hi, lo);
379 wxLongLongWx l1a(hi, lo);
380 wxLongLongNative l2a(hi, lo);
381 wxLongLongWx l1b(hi, lo);
382 wxLongLongNative l2b(hi, lo);
383
384 int increment = oddbits(rand());
385 int pre = oddbits(rand());
386
387 if (increment)
388 if (pre)
389 {
390 ++l1b;
391 ++l2b;
392 }
393 else
394 {
395 l1b++;
396 l2b++;
397 }
398 else
399 if (pre)
400 {
401 --l1b;
402 --l2b;
403 }
404 else
405 {
406 l1b--;
407 l2b--;
408 }
409
410 void *one = l1b.asArray();
411 void *two = l2b.asArray();
412
413 if (memcmp(one, two, 8) != 0)
414 {
162b0c3b
VZ
415 cout << endl << "After " << wxLongLongNative(counter) << " successful trials: " << endl;
416 cout << l1a << endl;
417 cout << l2a << endl;
418 cout << (pre ? "pre" : "post") << (increment ? "increment" : "decrement") << endl;
419 cout << l1b << endl;
420 cout << l2b << endl;
ef58b382
VZ
421 return 0;
422 }
423 counter++;
424 }
425
162b0c3b 426 cout << endl << wxLongLongNative(counter) << " successful trial" << (counter == 1 ? "." : "s.") << endl;
ef58b382
VZ
427
428 return 1;
429}
430
431int negationtest();
432
433int negationtest()
434{
162b0c3b 435 cout << endl << "Starting negation tests." << endl;
ef58b382
VZ
436
437 long hi = 0;
438 unsigned long lo = 0;
439
440 unsigned wxLongLong_t counter = 0;
441
442 while (counter < NumberOfTests)
443 {
444 if ((counter % 1000) == 999)
445 {
162b0c3b 446 cerr << "+";
ef58b382
VZ
447#if defined(__MWERKS__) && macintosh
448 GetNextEvent(0, NULL);
449#endif
450 }
451
452 random(hi, lo);
453 wxLongLongWx l1a(hi, lo);
454 wxLongLongNative l2a(hi, lo);
455 wxLongLongWx l1b(-l1a);
456 wxLongLongNative l2b(-l2a);
457
458 void *one = l1b.asArray();
459 void *two = l2b.asArray();
460
461 if (memcmp(one, two, 8) != 0)
462 {
162b0c3b
VZ
463 cout << endl << "After " << wxLongLongNative(counter) << " successful trials: " << endl;
464 cout << l1a << endl;
465 cout << l2a << endl;
466 cout << l1b << endl;
467 cout << l2b << endl;
ef58b382
VZ
468 return 0;
469 }
470 counter++;
471 }
472
162b0c3b 473 cout << endl << wxLongLongNative(counter) << " successful trial" << (counter == 1 ? "." : "s.") << endl;
ef58b382
VZ
474
475 return 1;
476}
477
478int multiplicationtest();
479
480int multiplicationtest()
481{
162b0c3b 482 cout << endl << "Starting multiplication tests." << endl;
ef58b382
VZ
483
484 long hi = 0;
485 unsigned long lo = 0;
486
487 unsigned wxLongLong_t counter = 0;
488
489 while (counter < NumberOfTests)
490 {
491 if ((counter % 1000) == 999)
492 {
162b0c3b 493 cerr << "+";
ef58b382
VZ
494#if defined(__MWERKS__) && macintosh
495 GetNextEvent(0, NULL);
496#endif
497 }
498
499 random(hi, lo);
500 wxLongLongWx l1a(hi, lo);
501 wxLongLongNative l2a(hi, lo);
502 wxLongLongWx l1d(hi, lo);
503 wxLongLongNative l2d(hi, lo);
504 random(hi, lo);
505 wxLongLongWx l1b(hi, lo);
506 wxLongLongNative l2b(hi, lo);
507
508 wxLongLongWx l1c(l1a * l1b);
509 wxLongLongNative l2c(l2a * l2b);
510
511 l1d *= l1b;
512 l2d *= l2b;
513
514 void *onec = l1c.asArray();
515 void *twoc = l2c.asArray();
516 void *oned = l1c.asArray();
517 void *twod = l2c.asArray();
518
519 if ((memcmp(onec, twoc, 8) != 0) || (memcmp(oned, twod, 8) != 0) || (memcmp(onec, oned, 8) != 0))
520 {
162b0c3b
VZ
521 cout << endl << "After " << wxLongLongNative(counter) << " successful trials: " << endl;
522 cout << l1a << endl;
523 cout << l2a << endl;
524 cout << l1b << endl;
525 cout << l2b << endl;
526 cout << l1c << endl;
527 cout << l2c << endl;
528 cout << l1d << endl;
529 cout << l2d << endl;
ef58b382
VZ
530 return 0;
531 }
532 counter++;
533 }
534
162b0c3b 535 cout << endl << wxLongLongNative(counter) << " successful trial" << (counter == 1 ? "." : "s.") << endl;
ef58b382
VZ
536
537 return 1;
538}
539
540int bitwisetest();
541
542int bitwisetest()
543{
162b0c3b 544 cout << endl << "Starting bitwise tests." << endl;
ef58b382
VZ
545
546 long hi = 0;
547 unsigned long lo = 0;
548
549 unsigned wxLongLong_t counter = 0;
550
551 while (counter < NumberOfTests)
552 {
553 if ((counter % 1000) == 999)
554 {
162b0c3b 555 cerr << "+";
ef58b382
VZ
556#if defined(__MWERKS__) && macintosh
557 GetNextEvent(0, NULL);
558#endif
559 }
560
561 random(hi, lo);
562 wxLongLongWx l1a(hi, lo);
563 wxLongLongNative l2a(hi, lo);
564 wxLongLongWx l1d(hi, lo);
565 wxLongLongNative l2d(hi, lo);
566 random(hi, lo);
567 wxLongLongWx l1b(hi, lo);
568 wxLongLongNative l2b(hi, lo);
569
570 wxLongLongWx l1c(l1a * l1b);
571 wxLongLongNative l2c(l2a * l2b);
572
573 l1d *= l1b;
574 l2d *= l2b;
575
576 void *onec = l1c.asArray();
577 void *twoc = l2c.asArray();
578 void *oned = l1c.asArray();
579 void *twod = l2c.asArray();
580
581 if ((memcmp(onec, twoc, 8) != 0) || (memcmp(oned, twod, 8) != 0) || (memcmp(onec, oned, 8) != 0))
582 {
162b0c3b
VZ
583 cout << endl << "After " << wxLongLongNative(counter) << " successful trials: " << endl;
584 cout << l1a << endl;
585 cout << l2a << endl;
586 cout << l1b << endl;
587 cout << l2b << endl;
588 cout << l1c << endl;
589 cout << l2c << endl;
590 cout << l1d << endl;
591 cout << l2d << endl;
ef58b382
VZ
592 return 0;
593 }
594 counter++;
595 }
596
162b0c3b 597 cout << endl << wxLongLongNative(counter) << " successful trial" << (counter == 1 ? "." : "s.") << endl;
ef58b382
VZ
598
599 return 1;
600}
601
602int main()
603{
604#if defined(__MWERKS__) && macintosh
605 SIOUXSettings.asktosaveonclose = 0;
606 SIOUXSettings.showstatusline = 1;
607 SIOUXSettings.autocloseonquit = 0;
608#endif
609
162b0c3b 610 cout << "Starting tests." << endl;
ef58b382
VZ
611
612#if defined(__MWERKS__) && macintosh
613 GetNextEvent(0, NULL);
614#endif
615
616 srand(time(NULL));
617
618 if (!multiplicationtest())
619 return 1;
620
621 if (!shifttest())
622 return 1;
623
624 if (!add1test())
625 return 1;
626
627// if (!add2test())
628// return 1;
629
630 if (!sub1test())
631 return 1;
632
633// if (!sub2test())
634// return 1;
635
636 if (!incdectest())
637 return 1;
638
639 if (!negationtest())
640 return 1;
641
162b0c3b 642 cout << endl << "The tests are finished." << endl;
ef58b382
VZ
643
644 return 0;
645}