The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!perl -T
use strict;
use warnings;
use Class::Builtin;
use Test::More qw/no_plan/; #tests => 1;
use Encode;

my $o = OO('小飼弾');
is(ref $o, 'Class::Builtin::Scalar', ref $o);

is($o->length, 9, sprintf qq('%s'->length), $o);
is($o->utf8->length, 3, sprintf qq('%s'->utf8->length), $o);
is($o->utf8->[2], decode_utf8('弾'), sprintf qq('%s'->utf8->[2]), $o);

$o = OO(0.00);
is (!$o, !!1, 'bool');
is ("$o", "0", '""');
is ($o+0, 0, '0+');

my $a  = 42;
my $b  = atan2(1,1) * 4;
my $oa = OO $a;
my $ob = OO $b;

for my $op (qw{+ - * / % ** << >> & | ^ . x }){
    my $code = eval qq{ sub { \$_[0] $op \$_[1] } };
    my $c  = $code->($a,  $b);
    my $oc = $code->($oa, $b);
    ok (ref $oc, "ref (OO($a) $op $b)");
    is ($c, $oc, "OO($a) $op $b");
    $oc = $code->($oa, $ob);
    ok (ref $oc, "ref (OO($a) $op OO($b)");
    is ($c, $oc, "OO($a) $op OO($b)");
}

__END__