The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w
use strict;
use Test::More;
use Encode qw(decode encode);

use MozRepl::RemoteObject;

my $repl;
my $ok = eval {
    $repl = MozRepl::RemoteObject->install_bridge(
        #log => [qw[debug]],
    );
    1;
};
if (! $ok) {
    my $err = $@;
    plan skip_all => "Couldn't connect to MozRepl: $@";
} else {
    plan tests => 9;
};

my $four = $repl->expr(<<JS);
    2+2
JS

is $four, 4, "Addition in Javascript works";

my $wrapped_repl = $repl->expr(<<JS);
    repl
JS

my $repl_id = $wrapped_repl->__id;
my $identity = $repl->expr(<<JS);
    repl === repl.getLink($repl_id)
JS

is $identity, 'true', "Object identity in Javascript works";

my $adder = $repl->expr(<<JS);
    f=function(a,b) { 
        // alert(a+b);
        return a+b
    };f
JS
isa_ok $adder, 'MozRepl::RemoteObject::Instance';

my $five = $adder->(2,3);
is $five, 5, "Anonymous functions in Javascript work as well";

# Now check whether we can pass in and out high-bit content

use charnames ':full';
my $unicode = "\N{WHITE SMILING FACE}";
my $result = $adder->("[$unicode","$unicode]");
is $result, "[$unicode$unicode]", "Passing unicode in and out works"
    or do { diag sprintf "%02x", ord($_) for split //, $result};

my $ae = "\N{LATIN CAPITAL LETTER A WITH DIAERESIS}";
my $latin1 = encode('Latin-1',$ae);
my $utf8_ae = decode('Latin-1',$latin1);
is $ae, $utf8_ae, "My assumptions about Latin-1/utf8 hold";
$result = undef;
my $lives = eval {
    $result = $adder->("[$latin1","$latin1]");
    1;
};
my $err = $@;
ok $lives, "We can pass in Latin-1";
is $err, '', "We get no error";
is $result, "[$utf8_ae$utf8_ae]", "We get a unicode result";