use v6-alpha;
use Test;
plan 22;
# L
# XXX tests for fff
sub take (Int $n, Code &f) { (1..$n).map:{ try { f() } } }
sub always_false { 0 }
sub always_true { 1 }
# Basic ff
{
ok eval('1 ff 1'), 'flip-flop operator implemented', :todo;
}
{
my @result = eval('take 5, { ?(always_false() ff always_false()) }');
is ~@result, " ", "always_false() ff always_false()", :todo;
}
{
my @result = eval('take 5, { ?(always_false() ff always_true()) }');
is ~@result, " ", "always_false() ff always_true()", :todo;
}
{
my @result = eval('take 5, { ?(always_true() ff always_true()) }');
ok all(@result), "always_true() ff always_true()";
}
{
my @result = eval('take 5, { ?(always_true() ff always_false()) }');
is ~@result, "1 2 3 4 5", "always_true() ff always_false()", :todo;
}
# Basic ^ff
{
my @result = eval('take 5, { ?(always_false() ^ff always_false()) }');
is ~@result, " ", "always_false() ^ff always_false()", :todo;
}
{
my @result = eval('take 5, { ?(always_false() ^ff always_true()) }');
is ~@result, " ", "always_false() ^ff always_true()", :todo;
}
{
my @result = eval('take 5, { ?(always_true() ^ff always_true()) }') || 1;
my $first = shift @result;
ok !$first && all(@result), "always_true() ^ff always_true()",:todo;
}
{
my @result = eval('take 5, { ?(always_true() ^ff always_false()) }');
is ~@result, " 2 3 4 5", "always_true() ^ff always_false()", :todo;
}
# Basic ff^
{
my @result = eval('take 5, { ?(always_false() ff^ always_false()) }');
is ~@result, " ", "always_false() ff^ always_false()", :todo;
}
{
my @result = eval('take 5, { ?(always_false() ff^ always_true()) }');
is ~@result, " ", "always_false() ff^ always_true()", :todo;
}
{
my @result = eval('take 5, { ?(always_true() ff^ always_true()) }');
# XXX what should the result be?
}
{
my @result = eval('take 5, { ?(always_true() ff^ always_false()) }');
is ~@result, "1 2 3 4 5", "always_true() ff^ always_false()", :todo;
}
# RHS not evaluated when in "false" state (perldoc perlop, /flip-flop)
{
{ my $bug; ok eval('0 ff {$bug=2};$bug ||=1'),:todo; ok ($bug == 1), "RHS not evaluated in \"false\" state (ff)", :todo; }
{ my $bug; ok eval('0 ^ff {$bug=2};$bug ||=1'),:todo; ok ($bug == 1), "RHS not evaluated in \"false\" state (^ff)", :todo; }
{ my $bug; ok eval('0 ff^ {$bug=2};$bug ||=1'),:todo; ok ($bug == 1), "RHS not evaluated in \"false\" state (ff^)", :todo; }
}
# LHS not evaluated when in "true" state (perldoc perlop, /flip-flop)
{
my sub true_then_die {
state $invoked;
unless $invoked++ {
"true";
} else {
die;
}
}
ok eval('true_then_die() ff always_false();true_then_die() ff always_false()'),
"LHS not evaluated in \"true\" state (ff)", :todo;
ok eval('true_then_die() ^ff always_false();true_then_die() ^ff always_false()'),
"LHS not evaluated in \"true\" state (^ff)", :todo;
ok eval('true_then_die() ff^ always_false();true_the_die() ff^ always_false()'),
"LHS not evaluated in \"true\" state (ff^)", :todo;
}
# See thread "till (the flipflop operator, formerly ..)" on p6l started by Ingo
# Blechschmidt, especially Larry's reply:
# http://www.nntp.perl.org/group/perl.perl6.language/24098
{
ok eval('my sub foo ($x) { try { $x ff 0 } }; if foo(0) || !foo(1) || !foo(0) { die }'),
"all sub invocations share the same ff-state", :todo;
}