The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use strict;
use warnings;

use Test::More tests => 2602;

my @classes = ('Math::BigRat');

# We should test all the following operators:
#
#     & | ^ << >> &= |= ^= <<= >>=
#
# as well as the corresponding methods
#
#     band bior bxor blsft brsft

for my $class (@classes) {
    use_ok($class);

    for my $op (qw( & | ^ )) {
        for (my $xscalar = 0 ; $xscalar <= 8 ; $xscalar += 0.5) {
            for (my $yscalar = 0 ; $yscalar <= 8 ; $yscalar += 0.5) {

                my $xint = int $xscalar;
                my $yint = int $yscalar;

                my $x = $class -> new("$xscalar");
                my $y = $class -> new("$yscalar");

                my $test     = "$x $op $y";
                my $expected = eval "$xscalar $op $yscalar";
                my $got      = eval "\$x $op \$y";

                is($@, '', 'is $@ empty');
                isa_ok($got, $class, $test);
                is($got, $expected,
                   "$x $op $y = $xint $op $yint = $expected");
            }
        }
    }
}