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

use Test::More tests => 25;
use strict;
use utf8;

#--------------------------------------------------------------------#
# Test 1: See if the module loads

BEGIN { use_ok('JE') };

#--------------------------------------------------------------------#
# Test 2: Parse code

my $j = new JE;

isa_ok( my $code = $j->parse( <<'--end--' ), 'JE::Code');
  var a = 1 < 2;
  var b = 3 > 4;
  var c = 5 >= 6;
  var d = 7 <= 8;
  var e = 9 instanceof Function;
  var f = 11 in {};

  var a1 =1<2;
  var b1 =3>4;
  var c1 =5>=6;
  var d1 =7<=8;
  var e1 =(9)instanceof(Object);
  var f1 =(11)in{12:13};

  for(var a2 = 1 < 2;0;);
  for(var b2 = 3 > 4;0;);
  for(var c2 = 5 >= 6;0;);
  for(var d2 = 7 <= 8;0;);
  for(var e2 = 9 instanceof Function;0;);

  for(var a3 =1<2;0;);
  for(var b3 =3>4;0;);
  for(var c3 =5>=6;0;);
  for(var d3 =7<=8;0;);
  for(var e3 =(9)instanceof(Object);0;);
--end--

#--------------------------------------------------------------------#
# Test 3: Run code

$code->execute;
is($@, '', 'execute code');

#--------------------------------------------------------------------#
# Tests 4-25: Check side-effects

is( $j->prop('a'), 'true', 'a < b' );
is( $j->prop('b'), 'false', 'a > b' );
is( $j->prop('c'), 'false', 'a >= b'  );
is( $j->prop('d'), 'true',  'a <= b'     );
is( $j->prop('e'), 'false', 'a instanceof b' );
is( $j->prop('f'), 'false', 'a in b'            );
is( $j->prop('a1'), 'true', 'a<b'                 );
is( $j->prop('b1'), 'false', 'a>b'                 );
is( $j->prop('c1'), 'false', 'a>=b'                );
is( $j->prop('d1'), 'true',  'o<=b'               );
is( $j->prop('e1'), 'false', '(a)instanceof(b)' );
is( $j->prop('f1'), 'false', '(a)in{b:c}'      );
is( $j->prop('a2'), 'true',  'for(a < b;;)'    );
is( $j->prop('b2'), 'false', 'for(a > b;;)'    );
is( $j->prop('c2'), 'false', 'for(a >= b;;)'    );
is( $j->prop('d2'), 'true',  'for(a <= b;;)'      );
is( $j->prop('e2'), 'false', 'for(a instanceof b;;)' );
is( $j->prop('a3'), 'true',  'for(a<b;;)'              );
is( $j->prop('b3'), 'false', 'for(a>b;;)'               );
is( $j->prop('c3'), 'false', 'for(a>=b;;)'              );
is( $j->prop('d3'), 'true',  'for(a<=b;;)'             );
is( $j->prop('e3'), 'false', 'for((a)instanceof(b);;)' );