#!/usr/bin/ruby
# Tests for the `Perl` class.
# Number eval
var perl_code = <<'EOT';
my $x = 12;
my $y = 16;
sqrt($x**2 + $y**2);
EOT
var num = Perl.eval(perl_code);
assert_eq(num, 20)
# Array eval
var array = Perl.eval(<<'EOT');
my @factorials;
sub factorial {
my ($n) = @_;
return 1 if $n <= 1;
push @factorials, $n * factorial($n - 1);
$factorials[-1];
}
factorial(5);
\@factorials;
EOT
assert_eq(array, [2, 6, 24, 120])
#=====================
# Transparent sub-call
#=====================
do {
var f = %perl{
sub {
my ($x, $y) = @_;
return ($x+1, $y+2);
}
}
var (a,b) = f(5, 6)
assert_eq(a, 5+1)
assert_eq(b, 6+2)
}
do { # Recursive Fibonacci in Perl
var f = %perl{
sub {
my ($n) = @_;
return $n if ($n <= 1);
__SUB__->($n-1) + __SUB__->($n-2);
}
}
assert_eq(Num(f(12)), 144)
}
assert_eq(Perl.eval("'0'"), 0)
assert_eq(Perl.eval("'00'"), "00")
assert_eq(Perl.eval("'000'"), "000")
assert_eq(Perl.eval("'010'"), "010")
assert_eq(Perl.eval("'00111'"), "00111")
assert_eq(Perl.eval("'0.1'"), 0.1f)
#=================================
# Transparent sub-call with module
#=================================
do {
require('Text::Wrap')
var str = %perl{
sub {
local $Text::Wrap::columns = 50;
Text::Wrap::wrap('', '', @_);
}
}(File(__FILE__).read.words...)
assert(str.lines.all { .len <= 50 })
}
say "** Test passed!"