t/TestLemplate.pm - lemplate

Data types defined

Source code

  1. package t::TestLemplate;

  2. use lib 'inc';
  3. use Test::Base -Base;
  4. use File::Temp qw( tempfile );
  5. use File::Copy qw( copy );
  6. use IPC::Run3 qw( run3 );
  7. use Lemplate;

  8. our @EXPORT = qw( run_tests );

  9. sub run_tests {
  10.     for my $block (blocks()) {
  11.         run_test($block);
  12.     }
  13. }

  14. sub run_test ($) {
  15.     my $block = shift;
  16.     #print $json_xs->pretty->encode(\@new_rows);
  17.     #my $res = #print $json_xs->pretty->encode($res);
  18.     my $name = $block->name;

  19.     my $tt2 = $block->tt2;
  20.     if (!defined $tt2) {
  21.         die "No --- tt2 specified for test $name\n";
  22.     }

  23.     my ($out_fh, $tt2file) = tempfile("tmpXXXXX", SUFFIX => '.tt2', UNLINK => 1);
  24.     print $out_fh $tt2;
  25.     close $out_fh;

  26.     my @cmd = ($^X, "./bin/lemplate", "--compile", $tt2file);

  27.     my ($comp_out, $comp_err);

  28.     run3(\@cmd, undef, \$comp_out, \$comp_err);

  29.     #warn "res:$res\nerr:$comp_err\n";

  30.     if (defined $block->comp_err) {
  31.         if (ref $block->comp_err) {
  32.             like $comp_err, $block->comp_err, "$name - comp_err expected";
  33.         } else {
  34.             is $comp_err, $block->comp_err, "$name - comp_err expected";
  35.         }

  36.     } elsif ($?) {
  37.         if (defined $block->fatal) {
  38.             pass("failed as expected");

  39.         } else {
  40.             fail("failed to compile TT2 source for test $name: $comp_err\n");
  41.             return;
  42.         }

  43.     } else {
  44.         if ($comp_err) {
  45.             if (!defined $block->comp_err) {
  46.                 warn "$comp_err\n";

  47.             } else {
  48.                 is $comp_err, $block->comp_err, "$name - err ok";
  49.             }
  50.         }
  51.     }

  52.     my $expected_lua = $block->lua;
  53.     if (defined $expected_lua) {
  54.         if (ref $expected_lua) {
  55.             like $comp_out, $expected_lua, "$name - lua expected";
  56.         } else {
  57.             is $comp_out, $expected_lua, "$name - lua expected";
  58.         }
  59.     }

  60.     my $luafile;
  61.     ($out_fh, $luafile) = tempfile("tmpXXXXX", SUFFIX => '.lua', UNLINK => 1);
  62.     print $out_fh $comp_out;
  63.     close $out_fh;

  64.     copy($luafile, "a.lua") or die $!;

  65.     (my $luamod = $luafile) =~ s/\.lua$//;

  66.     my $define = $block->define // '';
  67.     my $init = $block->init // '';

  68.     @cmd = ("resty", "-e", qq{$init ngx.print(require("$luamod").process("$tt2file", {$define}))});
  69.     #warn "cmd: @cmd";

  70.     my ($run_out, $run_err);

  71.     run3(\@cmd, undef, \$run_out, \$run_err);

  72.     if (defined $block->lua_err) {
  73.         $run_err =~ s/^\S+\.lua:\d+:\s*//;
  74.         if (ref $block->lua_err) {
  75.             like $run_err, $block->lua_err, "$name - run_err expected";
  76.         } else {
  77.             is $run_err, $block->lua_err, "$name - run_err expected";
  78.         }

  79.     } elsif ($?) {
  80.         if (defined $block->fatal) {
  81.             pass("failed as expected");

  82.         } else {
  83.             fail("failed to run Lua code for test $name: $run_err\n");
  84.             return;
  85.         }

  86.     } else {
  87.         if ($run_err) {
  88.             if (!defined $block->lua_err) {
  89.                 warn "$run_err\n";

  90.             } else {
  91.                 is $run_err, $block->lua_err, "$name - err ok";
  92.             }
  93.         }
  94.     }

  95.     my $expected_out = $block->out;
  96.     if (defined $expected_out) {
  97.         if (defined $run_out) {
  98.             $run_out =~ s/^\n+//gs;
  99.             $run_out =~ s/\n\n+$/\n/gs;
  100.         }
  101.         if (ref $expected_out) {
  102.             like $run_out, $expected_out, "$name - out expected";
  103.         } else {
  104.             is $run_out, $expected_out, "$name - out expected";
  105.         }
  106.     }
  107. }

  108. 1;