6 use Bit::Vector::Overload;
8 $Bit::Vector::CONFIG[2] = 3;
10 # ======================================================================
11 # test overloaded operators
12 # ======================================================================
14 $operator_list{'+='} = 1;
15 $operator_list{'|='} = 1;
16 $operator_list{'-='} = 1;
17 $operator_list{'*='} = 1;
18 $operator_list{'&='} = 1;
19 $operator_list{'^='} = 1;
20 $operator_list{'<<='} = 1;
21 $operator_list{'>>='} = 1;
22 $operator_list{'x='} = 1;
23 $operator_list{'.='} = 1;
25 $operator_list{'+'} = 2;
26 $operator_list{'|'} = 2;
27 $operator_list{'-'} = 2;
28 $operator_list{'*'} = 2;
29 $operator_list{'&'} = 2;
30 $operator_list{'^'} = 2;
31 $operator_list{'<<'} = 2;
32 $operator_list{'>>'} = 2;
33 $operator_list{'x'} = 2;
34 $operator_list{'.'} = 2;
36 $operator_list{'=='} = 2;
37 $operator_list{'!='} = 2;
38 $operator_list{'<'} = 2;
39 $operator_list{'<='} = 2;
40 $operator_list{'>'} = 2;
41 $operator_list{'>='} = 2;
42 $operator_list{'cmp'} = 2;
43 $operator_list{'eq'} = 2;
44 $operator_list{'ne'} = 2;
45 $operator_list{'lt'} = 2;
46 $operator_list{'le'} = 2;
47 $operator_list{'gt'} = 2;
48 $operator_list{'ge'} = 2;
54 $set = Bit::Vector->new(500);
56 {print "ok $n\n";} else {print "not ok $n\n";}
58 if ($set->Min() >= 500)
59 {print "ok $n\n";} else {print "not ok $n\n";}
62 {print "ok $n\n";} else {print "not ok $n\n";}
65 {print "ok $n\n";} else {print "not ok $n\n";}
68 {print "ok $n\n";} else {print "not ok $n\n";}
73 {print "ok $n\n";} else {print "not ok $n\n";}
76 {print "ok $n\n";} else {print "not ok $n\n";}
79 {print "ok $n\n";} else {print "not ok $n\n";}
82 {print "ok $n\n";} else {print "not ok $n\n";}
85 {print "ok $n\n";} else {print "not ok $n\n";}
90 {print "ok $n\n";} else {print "not ok $n\n";}
93 {print "ok $n\n";} else {print "not ok $n\n";}
96 {print "ok $n\n";} else {print "not ok $n\n";}
99 {print "ok $n\n";} else {print "not ok $n\n";}
102 {print "ok $n\n";} else {print "not ok $n\n";}
107 {print "ok $n\n";} else {print "not ok $n\n";}
109 if ($set->Min() == 1)
110 {print "ok $n\n";} else {print "not ok $n\n";}
112 if ($set->Max() == 1)
113 {print "ok $n\n";} else {print "not ok $n\n";}
118 {print "ok $n\n";} else {print "not ok $n\n";}
120 if ($set->Min() == 1)
121 {print "ok $n\n";} else {print "not ok $n\n";}
123 if ($set->Max() == 400)
124 {print "ok $n\n";} else {print "not ok $n\n";}
129 {print "ok $n\n";} else {print "not ok $n\n";}
131 if ($set->Min() == 0)
132 {print "ok $n\n";} else {print "not ok $n\n";}
134 if ($set->Max() == 400)
135 {print "ok $n\n";} else {print "not ok $n\n";}
140 {print "ok $n\n";} else {print "not ok $n\n";}
143 $ref = $set->new(500);
145 {print "ok $n\n";} else {print "not ok $n\n";}
148 {print "ok $n\n";} else {print "not ok $n\n";}
153 {print "ok $n\n";} else {print "not ok $n\n";}
156 {print "ok $n\n";} else {print "not ok $n\n";}
161 {print "ok $n\n";} else {print "not ok $n\n";}
163 if ($ref->Min() == 0)
164 {print "ok $n\n";} else {print "not ok $n\n";}
166 if ($ref->Max() == 400)
167 {print "ok $n\n";} else {print "not ok $n\n";}
169 if ($ref->bit_test(11))
170 {print "ok $n\n";} else {print "not ok $n\n";}
174 {print "ok $n\n";} else {print "not ok $n\n";}
177 {print "ok $n\n";} else {print "not ok $n\n";}
180 {print "ok $n\n";} else {print "not ok $n\n";}
183 {print "ok $n\n";} else {print "not ok $n\n";}
186 {print "ok $n\n";} else {print "not ok $n\n";}
189 {print "ok $n\n";} else {print "not ok $n\n";}
194 {print "ok $n\n";} else {print "not ok $n\n";}
196 if ($ref->Min() == 0)
197 {print "ok $n\n";} else {print "not ok $n\n";}
199 if ($ref->Max() == 499)
200 {print "ok $n\n";} else {print "not ok $n\n";}
205 {print "ok $n\n";} else {print "not ok $n\n";}
207 if ($ref->Min() == 0)
208 {print "ok $n\n";} else {print "not ok $n\n";}
210 if ($ref->Max() == 499)
211 {print "ok $n\n";} else {print "not ok $n\n";}
216 {print "ok $n\n";} else {print "not ok $n\n";}
218 if ($ref->Min() == 1)
219 {print "ok $n\n";} else {print "not ok $n\n";}
221 if ($ref->Max() == 499)
222 {print "ok $n\n";} else {print "not ok $n\n";}
227 {print "ok $n\n";} else {print "not ok $n\n";}
229 if ($ref->Min() == 1)
230 {print "ok $n\n";} else {print "not ok $n\n";}
232 if ($ref->Max() == 1)
233 {print "ok $n\n";} else {print "not ok $n\n";}
238 {print "ok $n\n";} else {print "not ok $n\n";}
240 if ($ref->Min() >= 500)
241 {print "ok $n\n";} else {print "not ok $n\n";}
244 {print "ok $n\n";} else {print "not ok $n\n";}
247 $limit = 1000; # some tests below assume this limit to be even!
249 $primes = Bit::Vector->new($limit+1);
251 {print "ok $n\n";} else {print "not ok $n\n";}
256 {print "ok $n\n";} else {print "not ok $n\n";}
259 if (abs($primes) == $limit+1)
260 {print "ok $n\n";} else {print "not ok $n\n";}
262 if ($primes->Min() == 0)
263 {print "ok $n\n";} else {print "not ok $n\n";}
265 if ($primes->Max() == $limit)
266 {print "ok $n\n";} else {print "not ok $n\n";}
272 for ( $j = 4; $j <= $limit; $j += 2 ) { $primes -= $j; }
274 for ( $i = 3; ($j = $i * $i) <= $limit; $i += 2 )
276 for ( ; $j <= $limit; $j += $i ) { $primes -= $j; }
279 if (abs($primes) == 168)
280 {print "ok $n\n";} else {print "not ok $n\n";}
282 if ($primes->Min() == 2)
283 {print "ok $n\n";} else {print "not ok $n\n";}
285 if ($primes->Max() == 997)
286 {print "ok $n\n";} else {print "not ok $n\n";}
289 $odd = $primes->new($limit+1);
291 {print "ok $n\n";} else {print "not ok $n\n";}
294 for ( $i = 1; $i <= $limit; $i += 2 ) { $odd += $i; }
297 {print "ok $n\n";} else {print "not ok $n\n";}
300 if (abs($odd) == $limit/2)
301 {print "ok $n\n";} else {print "not ok $n\n";}
303 if ($odd->Min() == 1)
304 {print "ok $n\n";} else {print "not ok $n\n";}
306 if ($odd->Max() == 999)
307 {print "ok $n\n";} else {print "not ok $n\n";}
310 if (!($odd == $primes))
311 {print "ok $n\n";} else {print "not ok $n\n";}
314 {print "ok $n\n";} else {print "not ok $n\n";}
316 if (!($primes < $odd))
317 {print "ok $n\n";} else {print "not ok $n\n";}
319 if (!($primes <= $odd))
320 {print "ok $n\n";} else {print "not ok $n\n";}
322 if (!($primes > $odd))
323 {print "ok $n\n";} else {print "not ok $n\n";}
325 if (!($primes >= $odd))
326 {print "ok $n\n";} else {print "not ok $n\n";}
329 $temp = $primes - $odd;
331 {print "ok $n\n";} else {print "not ok $n\n";}
334 {print "ok $n\n";} else {print "not ok $n\n";}
338 if (abs($odd) == ($limit/2)+1)
339 {print "ok $n\n";} else {print "not ok $n\n";}
341 if ($odd->Min() == 1)
342 {print "ok $n\n";} else {print "not ok $n\n";}
344 if ($odd->Max() == 999)
345 {print "ok $n\n";} else {print "not ok $n\n";}
347 if (!($odd == $primes))
348 {print "ok $n\n";} else {print "not ok $n\n";}
351 {print "ok $n\n";} else {print "not ok $n\n";}
354 {print "ok $n\n";} else {print "not ok $n\n";}
357 {print "ok $n\n";} else {print "not ok $n\n";}
359 if (!($primes > $odd))
360 {print "ok $n\n";} else {print "not ok $n\n";}
362 if (!($primes >= $odd))
363 {print "ok $n\n";} else {print "not ok $n\n";}
366 {print "ok $n\n";} else {print "not ok $n\n";}
369 {print "ok $n\n";} else {print "not ok $n\n";}
371 if (!($odd < $primes))
372 {print "ok $n\n";} else {print "not ok $n\n";}
374 if (!($odd <= $primes))
375 {print "ok $n\n";} else {print "not ok $n\n";}
378 $temp = $primes * $odd;
379 if ($temp == $primes)
380 {print "ok $n\n";} else {print "not ok $n\n";}
383 $temp = $primes + $odd;
385 {print "ok $n\n";} else {print "not ok $n\n";}
388 $temp = $primes ^ $odd;
390 $xor = $primes->new($limit+1);
392 {print "ok $n\n";} else {print "not ok $n\n";}
395 $xor->ExclusiveOr($primes,$odd);
397 {print "ok $n\n";} else {print "not ok $n\n";}
401 {print "ok $n\n";} else {print "not ok $n\n";}
403 if ($temp->equal($xor))
404 {print "ok $n\n";} else {print "not ok $n\n";}
408 {print "ok $n\n";} else {print "not ok $n\n";}
411 {print "ok $n\n";} else {print "not ok $n\n";}
414 {print "ok $n\n";} else {print "not ok $n\n";}
416 if (!(23 >= $primes))
417 {print "ok $n\n";} else {print "not ok $n\n";}
421 {print "ok $n\n";} else {print "not ok $n\n";}
424 {print "ok $n\n";} else {print "not ok $n\n";}
427 {print "ok $n\n";} else {print "not ok $n\n";}
429 if (!($primes <= 23))
430 {print "ok $n\n";} else {print "not ok $n\n";}
433 $temp = ($primes + $odd) - ($primes * $odd);
436 {print "ok $n\n";} else {print "not ok $n\n";}
438 if ($temp->equal($xor))
439 {print "ok $n\n";} else {print "not ok $n\n";}
444 for ( $i = 0; $i <= $limit; $i += 2 ) { $even += $i; }
446 if (($primes * $even) == 2)
447 {print "ok $n\n";} else {print "not ok $n\n";}
450 if (($odd * $even) == 2)
451 {print "ok $n\n";} else {print "not ok $n\n";}
456 if (($odd + $even) == $full)
457 {print "ok $n\n";} else {print "not ok $n\n";}
460 if (($primes + $even) == ~($odd - $primes))
461 {print "ok $n\n";} else {print "not ok $n\n";}
464 if (($primes + $even) == ~($odd * ~$primes))
465 {print "ok $n\n";} else {print "not ok $n\n";}
468 $set = Bit::Vector->new(500);
470 {print "ok $n\n";} else {print "not ok $n\n";}
472 if ($set->Min() >= 500)
473 {print "ok $n\n";} else {print "not ok $n\n";}
476 {print "ok $n\n";} else {print "not ok $n\n";}
479 {print "ok $n\n";} else {print "not ok $n\n";}
483 {print "ok $n\n";} else {print "not ok $n\n";}
486 {print "ok $n\n";} else {print "not ok $n\n";}
488 if ($set->Min() == 0)
489 {print "ok $n\n";} else {print "not ok $n\n";}
491 if ($set->Max() == 0)
492 {print "ok $n\n";} else {print "not ok $n\n";}
495 {print "ok $n\n";} else {print "not ok $n\n";}
499 {print "ok $n\n";} else {print "not ok $n\n";}
502 {print "ok $n\n";} else {print "not ok $n\n";}
504 if ($set->Min() == 1)
505 {print "ok $n\n";} else {print "not ok $n\n";}
507 if ($set->Max() == 1)
508 {print "ok $n\n";} else {print "not ok $n\n";}
511 {print "ok $n\n";} else {print "not ok $n\n";}
515 {print "ok $n\n";} else {print "not ok $n\n";}
518 {print "ok $n\n";} else {print "not ok $n\n";}
520 if ($set->Min() == 0)
521 {print "ok $n\n";} else {print "not ok $n\n";}
523 if ($set->Max() == 1)
524 {print "ok $n\n";} else {print "not ok $n\n";}
527 {print "ok $n\n";} else {print "not ok $n\n";}
531 {print "ok $n\n";} else {print "not ok $n\n";}
534 {print "ok $n\n";} else {print "not ok $n\n";}
536 if ($set->Min() == 1)
537 {print "ok $n\n";} else {print "not ok $n\n";}
539 if ($set->Max() == 1)
540 {print "ok $n\n";} else {print "not ok $n\n";}
543 {print "ok $n\n";} else {print "not ok $n\n";}
547 {print "ok $n\n";} else {print "not ok $n\n";}
550 {print "ok $n\n";} else {print "not ok $n\n";}
552 if ($set->Min() == 0)
553 {print "ok $n\n";} else {print "not ok $n\n";}
555 if ($set->Max() == 0)
556 {print "ok $n\n";} else {print "not ok $n\n";}
559 {print "ok $n\n";} else {print "not ok $n\n";}
563 {print "ok $n\n";} else {print "not ok $n\n";}
566 {print "ok $n\n";} else {print "not ok $n\n";}
568 if ($set->Min() >= 500)
569 {print "ok $n\n";} else {print "not ok $n\n";}
572 {print "ok $n\n";} else {print "not ok $n\n";}
575 {print "ok $n\n";} else {print "not ok $n\n";}
579 {print "ok $n\n";} else {print "not ok $n\n";}
581 if (abs($set) == 500)
582 {print "ok $n\n";} else {print "not ok $n\n";}
584 if ($set->Min() == 0)
585 {print "ok $n\n";} else {print "not ok $n\n";}
587 if ($set->Max() == 499)
588 {print "ok $n\n";} else {print "not ok $n\n";}
591 {print "ok $n\n";} else {print "not ok $n\n";}
595 {print "ok $n\n";} else {print "not ok $n\n";}
598 {print "ok $n\n";} else {print "not ok $n\n";}
600 if ($set->Min() >= 500)
601 {print "ok $n\n";} else {print "not ok $n\n";}
604 {print "ok $n\n";} else {print "not ok $n\n";}
607 {print "ok $n\n";} else {print "not ok $n\n";}
612 {print "ok $n\n";} else {print "not ok $n\n";}
617 {print "ok $n\n";} else {print "not ok $n\n";}
622 {print "ok $n\n";} else {print "not ok $n\n";}
627 {print "ok $n\n";} else {print "not ok $n\n";}
631 if (($set++)->Norm() == 0)
632 {print "ok $n\n";} else {print "not ok $n\n";}
636 if ((++$set)->Norm() == 1)
637 {print "ok $n\n";} else {print "not ok $n\n";}
641 if (($set--)->Norm() == 0)
642 {print "ok $n\n";} else {print "not ok $n\n";}
646 if ((--$set)->Norm() == 500)
647 {print "ok $n\n";} else {print "not ok $n\n";}
650 if (($primes cmp $odd) == -1)
651 {print "ok $n\n";} else {print "not ok $n\n";}
654 if (($odd cmp $primes) == 1)
655 {print "ok $n\n";} else {print "not ok $n\n";}
658 if ((($odd + $even) cmp $full) == 0)
659 {print "ok $n\n";} else {print "not ok $n\n";}
662 if ((($odd * $even) cmp 2) == 0)
663 {print "ok $n\n";} else {print "not ok $n\n";}
666 if ((2 cmp ($odd * $even)) == 0)
667 {print "ok $n\n";} else {print "not ok $n\n";}
670 if (($odd ^= 2) == ($full - $even))
671 {print "ok $n\n";} else {print "not ok $n\n";}
676 $temp = $odd + $even;
678 {print "ok $n\n";} else {print "not ok $n\n";}
683 {print "ok $n\n";} else {print "not ok $n\n";}
688 {print "ok $n\n";} else {print "not ok $n\n";}
692 if (abs($temp) == abs($odd) + 1)
693 {print "ok $n\n";} else {print "not ok $n\n";}
698 if (abs($temp) == abs($odd) + 1)
699 {print "ok $n\n";} else {print "not ok $n\n";}
702 $temp = $odd | $even;
704 {print "ok $n\n";} else {print "not ok $n\n";}
709 {print "ok $n\n";} else {print "not ok $n\n";}
714 {print "ok $n\n";} else {print "not ok $n\n";}
718 if (abs($temp) == abs($odd) + 1)
719 {print "ok $n\n";} else {print "not ok $n\n";}
724 if (abs($temp) == abs($odd) + 1)
725 {print "ok $n\n";} else {print "not ok $n\n";}
728 $temp = $full - $even;
730 {print "ok $n\n";} else {print "not ok $n\n";}
733 $empty = $temp->new($limit+1);
737 {print "ok $n\n";} else {print "not ok $n\n";}
741 if (abs($temp) == abs($even) - 1)
742 {print "ok $n\n";} else {print "not ok $n\n";}
747 {print "ok $n\n";} else {print "not ok $n\n";}
751 if (abs($temp) == abs($even) - 1)
752 {print "ok $n\n";} else {print "not ok $n\n";}
755 $temp = $primes * $even;
757 {print "ok $n\n";} else {print "not ok $n\n";}
760 $temp->Copy($primes);
761 if ($temp == $primes)
762 {print "ok $n\n";} else {print "not ok $n\n";}
767 {print "ok $n\n";} else {print "not ok $n\n";}
772 {print "ok $n\n";} else {print "not ok $n\n";}
775 $temp->Copy($primes);
778 {print "ok $n\n";} else {print "not ok $n\n";}
781 $temp = $primes & $even;
783 {print "ok $n\n";} else {print "not ok $n\n";}
786 $temp->Copy($primes);
787 if ($temp == $primes)
788 {print "ok $n\n";} else {print "not ok $n\n";}
793 {print "ok $n\n";} else {print "not ok $n\n";}
798 {print "ok $n\n";} else {print "not ok $n\n";}
801 $temp->Copy($primes);
804 {print "ok $n\n";} else {print "not ok $n\n";}
807 $temp = $odd ^ $even;
809 {print "ok $n\n";} else {print "not ok $n\n";}
814 {print "ok $n\n";} else {print "not ok $n\n";}
819 {print "ok $n\n";} else {print "not ok $n\n";}
823 if (abs($temp) == abs($odd) + 1)
824 {print "ok $n\n";} else {print "not ok $n\n";}
829 if (abs($temp) == abs($odd) + 1)
830 {print "ok $n\n";} else {print "not ok $n\n";}
833 if (($odd cmp $even) == -1)
834 {print "ok $n\n";} else {print "not ok $n\n";}
837 if (($even cmp $odd) == 1)
838 {print "ok $n\n";} else {print "not ok $n\n";}
843 {print "ok $n\n";} else {print "not ok $n\n";}
846 if (($temp cmp $odd) == 0)
847 {print "ok $n\n";} else {print "not ok $n\n";}
850 if (($odd cmp $temp) == 0)
851 {print "ok $n\n";} else {print "not ok $n\n";}
855 {print "ok $n\n";} else {print "not ok $n\n";}
858 if (!($odd ne $temp))
859 {print "ok $n\n";} else {print "not ok $n\n";}
862 if (!($primes eq $odd))
863 {print "ok $n\n";} else {print "not ok $n\n";}
867 {print "ok $n\n";} else {print "not ok $n\n";}
871 {print "ok $n\n";} else {print "not ok $n\n";}
875 {print "ok $n\n";} else {print "not ok $n\n";}
878 if (!($even lt $odd))
879 {print "ok $n\n";} else {print "not ok $n\n";}
882 if (!($even le $odd))
883 {print "ok $n\n";} else {print "not ok $n\n";}
886 if (!($odd gt $even))
887 {print "ok $n\n";} else {print "not ok $n\n";}
890 if (!($odd ge $even))
891 {print "ok $n\n";} else {print "not ok $n\n";}
895 {print "ok $n\n";} else {print "not ok $n\n";}
899 {print "ok $n\n";} else {print "not ok $n\n";}
902 # wrong parameter checks:
904 $set = Bit::Vector->new(500);
906 if ($set->Norm() == 0)
907 {print "ok $n\n";} else {print "not ok $n\n";}
912 if ($set->Norm() == 500)
913 {print "ok $n\n";} else {print "not ok $n\n";}
916 foreach $operator (keys %operator_list)
918 $parms = $operator_list{$operator};
922 if (ref($fake) eq 'SCALAR')
923 {print "ok $n\n";} else {print "not ok $n\n";}
928 if (ref($fake) eq 'ARRAY')
929 {print "ok $n\n";} else {print "not ok $n\n";}
934 if (ref($fake) eq 'HASH')
935 {print "ok $n\n";} else {print "not ok $n\n";}
940 if (ref($fake) eq 'CODE')
941 {print "ok $n\n";} else {print "not ok $n\n";}
947 if (ref($fake) eq 'REF')
948 {print "ok $n\n";} else {print "not ok $n\n";}
953 # bit shift operator tests:
955 foreach $bits (0,1,2,3,4,16,32,61,97,256,257,499,512)
957 $shift = ($primes << $bits);
959 $shift = $primes->Clone();
962 $shift = ($primes >> $bits);
964 $shift = $primes->Clone();
969 eval { $shift = (0 << $primes); };
970 if ($@ =~ /\billegal reversed operands in overloaded '<<' operator\b/)
971 {print "ok $n\n";} else {print "not ok $n\n";}
974 eval { $shift = (1 << $primes); };
975 if ($@ =~ /\billegal reversed operands in overloaded '<<' operator\b/)
976 {print "ok $n\n";} else {print "not ok $n\n";}
979 eval { $shift = (0 >> $primes); };
980 if ($@ =~ /\billegal reversed operands in overloaded '>>' operator\b/)
981 {print "ok $n\n";} else {print "not ok $n\n";}
984 eval { $shift = (1 >> $primes); };
985 if ($@ =~ /\billegal reversed operands in overloaded '>>' operator\b/)
986 {print "ok $n\n";} else {print "not ok $n\n";}
989 eval { $shift = (0 x $primes); };
990 if ($@ =~ /\billegal reversed operands in overloaded 'x' operator\b/)
991 {print "ok $n\n";} else {print "not ok $n\n";}
994 eval { $shift = (1 x $primes); };
995 if ($@ =~ /\billegal reversed operands in overloaded 'x' operator\b/)
996 {print "ok $n\n";} else {print "not ok $n\n";}
1007 $op =~ s/^[a-wyz]+$/cmp/;
1009 $message = quotemeta("illegal operand type in overloaded '$op' operator");
1012 $action = "\$set $operator \$fake";
1014 if ($@ =~ /$message/)
1015 {print "ok $n\n";} else {print "not ok $n\n";}
1020 $action = "\$temp = \$set $operator \$fake";
1022 if ($@ =~ /$message/)
1023 {print "ok $n\n";} else {print "not ok $n\n";}
1026 $action = "\$temp = \$fake $operator \$set";
1028 if ($@ =~ /$message/)
1029 {print "ok $n\n";} else {print "not ok $n)\n";}
1040 for ( $i = 0; $i <= $limit; $i++ )
1042 if ($primes->contains($i))
1045 if (($j >= 0) && ($j <= $limit))
1047 if ($shift->contains($j))
1048 {print "ok $n\n";} else {print "not ok $n\n";}
1052 if ($shift->contains($i))
1055 if (($j >= 0) && ($j <= $limit))
1057 if ($primes->contains($j))
1058 {print "ok $n\n";} else {print "not ok $n\n";}