The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::Base;

use Number::Object;

filters { l => [qw/ chop /], r => [qw/ chop /] };

my $plan = 10;
sub calc {
    my($l, $r) = @_;
    my @ret;
    my $tmp;

    $tmp = $l;
    $tmp += $r;
    push @ret, $tmp;

    $tmp = $l;
    $tmp -= $r;
    push @ret, $tmp;

    $tmp = $l;
    $tmp *= $r;
    push @ret, $tmp;

    $tmp = $l;
    $tmp /= $r;
    push @ret, $tmp;

    $tmp = $l;
    $tmp %= $r;
    push @ret, $tmp;

    $tmp = $l;
    $tmp **= $r;
    push @ret, $tmp;

    $tmp = $l;
    $tmp <<= $r;
    push @ret, $tmp;

    $tmp = $l;
    $tmp >>= $r;
    push @ret, $tmp;

    $tmp = $l;
    $tmp x= $r;
    push @ret, $tmp;

    $tmp = $l;
    $tmp .= $r;
    push @ret, $tmp;

    @ret;
}

plan tests => $plan * blocks;

run {
    my $block = shift;

    my @simple = calc($block->l, $block->r);
    my @object = calc(Number::Object->new($block->l), Number::Object->new($block->r));

    for my $i (0..($plan-1)) {
        is $simple[$i], $object[$i];
    }
}

__END__

===
--- l
10
--- r
20

===
--- l
20
--- r
20

===
--- l
20
--- r
10