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

use strict;
use constant HAS_THREADS => eval { require threads };
use Test::More ();

use if !( HAS_THREADS && $] >= 5.008008),
    'Test::More', skip_all => 'multi-threading tests';

use if ( Test::More->VERSION >= 2.0 ),
    'Test::More', skip_all => 'Test::Builder 2.0 is not thread-safe';

use Test::More tests => 13;

use Text::Xslate;
use t::lib::Util;

eval {
    my $tx = Text::Xslate->new(path => [path], cache => 0);
    is $tx->render('hello.tx', {lang => 'Xslate'}), "Hello, Xslate world!\n";

    threads->create(sub{ })->join();

    is $tx->render('hello.tx', {lang => 'Perl'}), "Hello, Perl world!\n";
};
is $@, '';

eval {
    my $tx = Text::Xslate->new(path => [path], cache => 0);
    is $tx->render('hello.tx', {lang => 'Xslate'}), "Hello, Xslate world!\n";

    threads->create(sub{
        #XXX: see the value attribute of T::X::Symbol
        is $tx->render('hello.tx', {lang => 'Thread'}),
            "Hello, Thread world!\n", "in a child thread"
                for 1 .. 2;
    })->join();

    is $tx->render('hello.tx', {lang => 'Perl'}), "Hello, Perl world!\n";
};
is $@, '';

eval {
    my $tx = Text::Xslate->new(
        function => {
            'array::count' => sub {
                my($a, $cb) = @_;
                return scalar grep { $cb->($_) } @{$a};
            },
        },
    );

    is $tx->render_string(q{<: [10, 20].count(-> $a { true }) :>}), 2, 'high level functions';

    threads->create(sub{
        is $tx->render_string(q{<: [10, 20, 30].count(-> $a { true }) :>}), 3
                for 1 .. 2;
    })->join();

    is $tx->render_string(q{<: [10, 20, 30, 40].count(-> $a { true }) :>}), 4;
};
is $@, '';