#!perl -T BEGIN { require './t/test.pl' } use Test::More tests => 74; use strict; use utf8; # Test 1: See if the module loads BEGIN { use_ok('JE') }; my $j = new JE; # Tests 2-3: Bind the ok and diag functions isa_ok( $j->new_function( ok => \&ok ), 'JE::Object::Function' ); isa_ok( $j->new_function( diag => \&diag ), 'JE::Object::Function' ); $j->prop(global => $j); # Run JS tests my $line = __LINE__+3; # If I put this on the next line, it gives the last # line of the here-doc (or something like that). defined $j->eval( <<'--end--', __FILE__, $line ) or die; // =================================================== // 11.1.1 this (not that) // =================================================== /* Tests 4-7 */ ok(global === this, '\'this\' keyword in global code') eval("ok(global === this, '\\'this\\' keyword in global-eval code')") obj = { f: function() { ok(this === obj, '\'this\' keyword in function code') eval("ok(this === obj, '\\'this\\' keyword in function-eval code')" ) } } obj.f() // =================================================== // 11.1.2 Identifiers // =================================================== // (identifier resolution is defined in 10.1.4) /* Test 8 */ var error try { NaN = 333 eval('NaN = 323'), pfpf = 3289 eval('onetoh = 389') function(a) { tht =3 a= 3 eval('thteoe = 3; a = 1') }() } catch(e) { error = true } ok(!error, 'The result of evalling an identifier is always an lvalue') // =================================================== // 11.1.3 Array literals // =================================================== /* Tests 9-60 */ a = [] ok(a.length === 0, '[]') a = [,] ok(a.length === 1 && !('0' in a), '[,]') a = [, ,] ok(a.length === 2 && !('0' in a) && !('1' in a), '[, ,]') a = [1] ok(a.length === 1 && a[0] === 1, '[ expr ]') a = [1,2] ok(a.length === 2 && a[0] === 1 && a[1] === 2, '[ expr, expr ]') a = [1, , 2] ok(a.length === 3 && a[0] === 1 && !('1' in a) && a[2] === 2, '[ expr, , expr ]') a = [1, ,, 2] ok(a.length === 4 && a[0] === 1 && !('1' in a) && !('2' in a) && a[3] === 2, '[ expr, ,, expr ]') a = [, 1] ok(a.length === 2 && !('0' in a) && a[1] === 1, '[ , expr ]') a = [, 1, 2] ok(a.length === 3 && !('0' in a) && a[1] === 1 && a[2] === 2, '[ , expr, expr ]') a = [, 1, , 2] ok(a.length === 4 && !('0' in a) && a[1] === 1 && !('2' in a) && a[3] === 2, '[ , expr, , expr ]') a = [, 1, ,, 2] ok(a.length === 5 && !('0' in a) && a[1] === 1 && !('2' in a) && !('3' in a) && a[4] === 2, '[ , expr, ,, expr ]') a = [,, 1] ok(a.length === 3 && !('0' in a) && !('1' in a) && a[2] === 1, '[ ,, expr ]') a = [,, 1, 2] ok(a.length === 4 && !('0' in a) && !('1' in a) && a[2] === 1 && a[3] === 2, '[ ,, expr, expr ]') a = [,, 1, , 2] ok(a.length === 5 && !('0' in a) && !('1' in a) && a[2] === 1 && !('3' in a) && a[4] === 2, '[ ,, expr, , expr ]') a = [,, 1, ,, 2] ok(a.length === 6 && !('0' in a) && !('1' in a) && a[2] === 1 && !('3' in a) && !('4' in a) && a[5] === 2, '[ ,, expr, ,, expr ]') a = [1,] ok(a.length === 1 && a[0] === 1, '[ expr, ]') a = [1, 2,] ok(a.length === 2 && a[0] === 1 && a[1] === 2, '[ expr, expr, ]') a = [1, , 2,] ok(a.length === 3 && a[0] === 1 && !('1' in a) && a[2] === 2, '[ expr, , expr, ]') a = [1, ,, 2,] ok(a.length === 4 && a[0] === 1 && !('1' in a) && !('2' in a) && a[3] === 2, '[ expr, ,, expr, ]') a = [, 1,] ok(a.length === 2 && !('0' in a) && a[1] === 1, '[ , expr, ]') a = [, 1, 2,] ok(a.length === 3 && !('0' in a) && a[1] === 1 && a[2] === 2, '[ , expr, expr, ]') a = [, 1, , 2,] ok(a.length === 4 && !('0' in a) && a[1] === 1 && !('2' in a) && a[3] === 2, '[ , expr, , expr, ]') a = [, 1, ,, 2,] ok(a.length === 5 && !('0' in a) && a[1] === 1 && !('2' in a) && !('3' in a) && a[4] === 2, '[ , expr, ,, expr, ]') a = [,, 1,] ok(a.length === 3 && !('0' in a) && !('1' in a) && a[2] === 1, '[ ,, expr, ]') a = [,, 1, 2,] ok(a.length === 4 && !('0' in a) && !('1' in a) && a[2] === 1 && a[3] === 2, '[ ,, expr, expr, ]') a = [,, 1, , 2,] ok(a.length === 5 && !('0' in a) && !('1' in a) && a[2] === 1 && !('3' in a) && a[4] === 2, '[ ,, expr, , expr, ]') a = [,, 1, ,, 2,] ok(a.length === 6 && !('0' in a) && !('1' in a) && a[2] === 1 && !('3' in a) && !('4' in a) && a[5] === 2, '[ ,, expr, ,, expr, ]') a = [1, ,] ok(a.length === 2 && a[0] === 1 && !('1' in a), '[ expr, , ]') a = [1, 2, ,] ok(a.length === 3 && a[0] === 1 && a[1] === 2 && !('2' in a), '[ expr, expr, , ]') a = [1, , 2, ,] ok(a.length === 4 && a[0] === 1 && !('1' in a) && a[2] === 2 && !('3' in a), '[ expr, , expr, , ]') a = [1, ,, 2, ,] ok(a.length === 5 && a[0] === 1 && !('1' in a) && !('2' in a) && a[3] === 2 && !('4' in a), '[ expr, ,, expr, , ]') a = [, 1, ,] ok(a.length === 3 && !('0' in a) && a[1] === 1 && !('2' in a), '[ , expr, , ]') a = [, 1, 2, ,] ok(a.length === 4 && !('0' in a) && a[1] === 1 && a[2] === 2 && !('3' in a), '[ , expr, expr, , ]') a = [, 1, , 2, ,] ok(a.length === 5 && !('0' in a) && a[1] === 1 && !('2' in a) && a[3] === 2 && !('4' in a), '[ , expr, , expr, , ]') a = [, 1, ,, 2, ,] ok(a.length === 6 && !('0' in a) && a[1] === 1 && !('2' in a) && !('3' in a) && a[4] === 2 && !('5' in a), '[ , expr, ,, expr, , ]') a = [,, 1, ,] ok(a.length === 4 && !('0' in a) && !('1' in a) && a[2] === 1 && !('3' in a), '[ ,, expr, , ]') a = [,, 1, 2, ,] ok(a.length === 5 && !('0' in a) && !('1' in a) && a[2] === 1 && a[3] === 2 && !('4' in a), '[ ,, expr, expr, , ]') a = [,, 1, , 2, ,] ok(a.length === 6 && !('0' in a) && !('1' in a) && a[2] === 1 && !('3' in a) && a[4] === 2 && !('5' in a), '[ ,, expr, , expr, , ]') a = [,, 1, ,, 2, ,] ok(a.length === 7 && !('0' in a) && !('1' in a) && a[2] === 1 && !('3' in a) && !('4' in a) && a[5] === 2 && !('6' in a), '[ ,, expr, ,, expr, , ]') a = [1, ,,] ok(a.length === 3 && a[0] === 1 && !('1' in a) && !('2' in a), '[ expr, ,, ]') a = [1, 2, ,,] ok(a.length === 4 && a[0] === 1 && a[1] === 2 && !('2' in a) && !('3' in a), '[ expr, expr, ,, ]') a = [1, , 2, ,,] ok(a.length === 5 && a[0] === 1 && !('1' in a) && a[2] === 2 && !('3' in a) && !('4' in a), '[ expr, , expr, ,, ]') a = [1, ,, 2, ,,] ok(a.length === 6 && a[0] === 1 && !('1' in a) && !('2' in a) && a[3] === 2 && !('4' in a) && !('5' in a), '[ expr, ,, expr, ,, ]') a = [, 1, ,,] ok(a.length === 4 && !('0' in a) && a[1] === 1 && !('2' in a) && !('3' in a), '[ , expr, ,, ]') a = [, 1, 2, ,,] ok(a.length === 5 && !('0' in a) && a[1] === 1 && a[2] === 2 && !('3' in a) && !('4' in a), '[ , expr, expr, ,, ]') a = [, 1, , 2, ,,] ok(a.length === 6 && !('0' in a) && a[1] === 1 && !('2' in a) && a[3] === 2 && !('4' in a) && !('5' in a), '[ , expr, , expr, ,, ]') a = [, 1, ,, 2, ,,] ok(a.length === 7 && !('0' in a) && a[1] === 1 && !('2' in a) && !('3' in a) && a[4] === 2 && !('5' in a) && !('6' in a), '[ , expr, ,, expr, ,, ]') a = [,, 1, ,,] ok(a.length === 5 && !('0' in a) && !('1' in a) && a[2] === 1 && !('3' in a) && !('4' in a), '[ ,, expr, ,, ]') a = [,, 1, 2, ,,] ok(a.length === 6 && !('0' in a) && !('1' in a) && a[2] === 1 && a[3] === 2 && !('4' in a) && !('5' in a), '[ ,, expr, expr, ,, ]') a = [,, 1, , 2, ,,] ok(a.length === 7 && !('0' in a) && !('1' in a) && a[2] === 1 && !('3' in a) && a[4] === 2 && !('5' in a) && !('6' in a), '[ ,, expr, , expr, ,, ]') a = [,, 1, ,, 2, ,,] ok(a.length === 8 && !('0' in a) && !('1' in a) && a[2] === 1 && !('3' in a) && !('4' in a) && a[5] === 2 && !('6' in a) && !('7' in a), '[ ,, expr, ,, expr, ,, ]') var error = false try { a = [i_hope_this_variable_does_not_exist] } catch(e) { error = e } ok(error instanceof ReferenceError, 'array literals resolve lvalues'); // =================================================== // 11.1.3 Object literals // =================================================== /* Tests 61-73 */ function keys(obj) { var k = [] for(k[k.length] in obj); return k } o = {} ok(keys(o) == '', '{ }') o = { Makarios: 'anēr' } ok(keys(o) == 'Makarios' && o.Makarios === 'anēr', '{ identifier: expr }') o = { hos: 'ouk', eporeuthē: 'en' } ok(keys(o) == 'hos,eporeuthē' && o.hos === 'ouk' && o.eporeuthē === 'en', '{ identifier: expr, identifier: expr }') o = { boulē: 'asebōn,', 'kai': 'en' } ok(keys(o) == 'boulē,kai' && o.boulē === 'asebōn,' && o.kai === 'en', '{ identifier: expr, string: expr }') o = { hodōi: 'hamartolōn', 1: 'ouk' } ok(keys(o) == 'hodōi,1' && o.hodōi === 'hamartolōn' && o[1] === 'ouk', '{ identifier: expr, number: expr }') o = { 'estē,': 'kai' } ok(keys(o) == 'estē,' && o['estē,'] === 'kai', '{ string: expr }') o = { 'epi': 'kathedrāi', limōn: 'ouk' } ok(keys(o) == 'epi,limōn' && o.epi === 'kathedrāi' && o.limōn === 'ouk', '{ string: expr, identifier: expr }') o = { 'ekathisen.': 'All’', 'ē': 'en' } ok(keys(o) == 'ekathisen.,ē' && o['ekathisen.'] === 'All’' && o.ē === 'en', '{ string: expr, string: expr }') o = { 'tōi': 'nomōi', 2: 'Kyriou' } ok(keys(o) == 'tōi,2' && o.tōi === 'nomōi' && o[2] === 'Kyriou', '{ string: expr, number: expr }') o = { 3: 'to' } ok(keys(o) == '3' && o[3] === 'to', '{ number: expr }') o = { 4: 'thelēma', autou: 'kai' } ok(keys(o) == '4,autou' && o[4] === 'thelēma' && o.autou === 'kai', '{ number: expr, identifier: expr }') o = { 5: 'en', 'to': 'nomōi' } ok(keys(o) == '5,to' && o[5] === 'en' && o.to === 'nomōi', '{ number: expr, string: expr }') o = { 6: 'autou', 7: 'meletēsei' } ok(keys(o) == '6,7' && o[6] === 'autou' && o[7] === 'meletēsei', '{ number: expr, number: expr }') // =================================================== // 11.1.3 Grouping parentheses // =================================================== /* Test 74 */ ok((3)===3, 'grouping parentheses') --end--