#!/usr/bin/perl use strict; use warnings; use Test::More 'no_plan'; use Test::Deep; use Test::Exception; use lib 't/lib'; use Blondie::Nodes; use Blondie::Runtime::Nada; my $m; BEGIN { use_ok($m = "Blondie::Compiler") } isa_ok(my $o = $m->new, $m); my $n = Blondie::Runtime::Nada->new; { my $env = Blondie::Env->new( '&func' => Thunk('moose'), ); my $prog = App( Sym('&func') ); my $c = $o->compile($n, $env, $prog); cmp_deeply( $c, App( Val( $env->get('&func') )), "symbol resolved during compile time", ); } { my $env = Blondie::Env->new( '&func' => Thunk( Seq( Param('$x'), Sym('$x'), ), ), ); my $prog = App( Sym('&func'), Val(1), ); my $c = $o->compile($n, $env, $prog); cmp_deeply( $c, App( Val( $env->get('&func') ), Val(1) ), "dynamic symbol inside function delayed till runtime because it's a param", ); } { my $env = Blondie::Env->new( stub '&func', ); my $prog = App( Sym('&func') ); throws_ok { my $c = $o->compile($n, $env, $prog); } qr/stub/, "can't use a function that isn't unstubbed"; }