The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!./perl

BEGIN {
    chdir 't' if -d 't';
    require './test.pl';
    set_up_inc('../lib');
}

use strict;
use warnings;
no warnings 'experimental::smartmatch';

plan tests => 42;

foreach(3) {
    CORE::whereso(3) {
	pass "CORE::whereso without feature flag";
    }
}

use feature 'switch';

foreach(3) {
    CORE::whereso(3) {
	pass "CORE::whereso with feature flag";
    }
}

foreach(3) {
    whereso(3) {
	pass "whereso with feature flag";
    }
}

foreach(0, 1) {
    my $x = "foo";
    is($x, "foo", "whereso lexical scope not started yet");
    whereso(my $x = ($_ && "bar")) {
	is($x, "bar", "whereso lexical scope starts");
    }
    is($x, "foo", "whereso lexical scope ends");
}

foreach(3) {
    whereso($_ == 2) { fail; }
    pass;
}

foreach(3) {
    whereso($_ == 3) { pass; }
    fail;
}

foreach(3) {
    whereso($_ == 2) { fail; }
    whereso($_ == 3) { pass; }
    whereso($_ == 4) { fail; }
    whereso($_ == 3) { fail; }
}

foreach(undef, 3) {
    whereso(undef) { fail; }
    pass;
}

foreach(undef, 1, 3) {
    whereso(0) { fail; }
    pass;
}

foreach(undef, 1, 3) {
    whereso(1) { pass; }
    fail;
}

sub is_list_context { wantarray }
sub is_scalar_context { !wantarray && defined(wantarray) }
sub is_void_context { !defined(wantarray) }
foreach(3) {
    whereso(is_list_context()) { fail; }
    pass;
}
foreach(3) {
    whereso(is_scalar_context()) { pass; }
    fail;
}
foreach(3) {
    whereso(is_void_context()) { fail; }
    pass;
}
foreach(3) {
    whereso(is_list_context) { fail; }
    pass;
}
foreach(3) {
    whereso(is_scalar_context) { pass; }
    fail;
}
foreach(3) {
    whereso(is_void_context) { fail; }
    pass;
}

my $ps = "foo";
foreach(3) {
    whereso($ps) { pass; }
    fail;
}
$ps = "";
foreach(3) {
    whereso($ps) { fail; }
    pass;
}
our $gs = "bar";
foreach(3) {
    whereso($gs) { pass; }
    fail;
}
$gs = "";
foreach(3) {
    whereso($gs) { fail; }
    pass;
}
my @pa = qw(a b c d e);
foreach(3) {
    whereso(@pa) { pass; }
    fail;
}
@pa = ();
foreach(3) {
    whereso(@pa) { fail; }
    pass;
}
our @ga = qw(a b c d e);
foreach(3) {
    whereso(@ga) { pass; }
    fail;
}
@ga = ();
foreach(3) {
    whereso(@ga) { fail; }
    pass;
}
my %ph = qw(a b c d e f g h i j);
foreach(3) {
    whereso(%ph) { pass; }
    fail;
}
%ph = ();
foreach(3) {
    whereso(%ph) { fail; }
    pass;
}
our %gh = qw(a b c d e f g h i j);
foreach(3) {
    whereso(%gh) { pass; }
    fail;
}
%gh = ();
foreach(3) {
    whereso(%gh) { fail; }
    pass;
}

my $one = 1;
foreach(3) {
    whereso($one + 3) { pass; }
    fail;
}
foreach(3) {
    whereso($one - 1) { fail; }
    pass;
}

foreach(3) {
    whereso(()) { fail; }
    pass;
}

foreach my $z (3) {
    whereso(1) { pass; }
    fail;
}

my @a = qw(x y z);
my $act = "";
while(@a) {
    $act .= "[a@{[0+@a]}]";
    whereso(shift(@a) eq "y") {
	$act .= "[b]";
    }
    $act .= "[c]";
}
is $act, "[a3][c][a2][b][a1][c]";

$act = "";
{
    $act .= "[a]";
    whereso(0) { $act .= "[b]"; }
    $act .= "[c]";
    whereso(1) { $act .= "[d]"; }
    $act .= "[e]";
    whereso(1) { $act .= "[f]"; }
}
is $act, "[a][c][d]";

1;