blob: d678e6fb89b16936f4276cf3fa14a5dcc6aae220 [file] [log] [blame]
/*
* Copyright (C) Igor Sysoev
* Copyright (C) NGINX, Inc.
*/
#include <nxt_types.h>
#include <nxt_clang.h>
#include <nxt_stub.h>
#include <nxt_malloc.h>
#include <nxt_array.h>
#include <nxt_lvlhsh.h>
#include <nxt_mem_cache_pool.h>
#include <njscript.h>
#include <string.h>
#include <stdio.h>
#include <sys/resource.h>
#include <time.h>
typedef struct {
nxt_str_t script;
nxt_str_t ret;
} njs_unit_test_t;
static njs_unit_test_t njs_test[] =
{
/* Variable declarations. */
{ nxt_string("var x"),
nxt_string("undefined") },
{ nxt_string("var x;"),
nxt_string("undefined") },
{ nxt_string("var x;;"),
nxt_string("undefined") },
{ nxt_string("var x = 0"),
nxt_string("undefined") },
{ nxt_string("var x = 0;"),
nxt_string("undefined") },
{ nxt_string("var x = 0;;"),
nxt_string("undefined") },
{ nxt_string("var; a"),
nxt_string("SyntaxError: Unexpected token \";\" in 1") },
{ nxt_string("var + a"),
nxt_string("SyntaxError: Unexpected token \"+\" in 1") },
{ nxt_string("//\r\n; var + a"),
nxt_string("SyntaxError: Unexpected token \"+\" in 2") },
{ nxt_string("/*\n*/; var + a"),
nxt_string("SyntaxError: Unexpected token \"+\" in 2") },
{ nxt_string("var \n a \n = 1; a"),
nxt_string("1") },
{ nxt_string("var \n a, \n b; b"),
nxt_string("undefined") },
{ nxt_string("var a = 1; var b; a"),
nxt_string("1") },
{ nxt_string("function f(){} function f(){}"),
nxt_string("SyntaxError: Duplicate declaration \"f\" in 1") },
{ nxt_string("var f = 1; function f() {}"),
nxt_string("SyntaxError: Duplicate declaration \"f\" in 1") },
{ nxt_string("function f() {} var f = 1; f"),
nxt_string("1") },
/* Numbers. */
{ nxt_string("999999999999999999999"),
nxt_string("1e+21") },
#if 0
{ nxt_string("9223372036854775808"),
nxt_string("9223372036854775808") },
{ nxt_string("18446744073709551616"),
nxt_string("18446744073709552000") },
{ nxt_string("1.7976931348623157E+308"),
nxt_string("1.7976931348623157e+308") },
#endif
{ nxt_string("+1"),
nxt_string("1") },
{ nxt_string("+1\n"),
nxt_string("1") },
{ nxt_string(""),
nxt_string("undefined") },
{ nxt_string("\n"),
nxt_string("undefined") },
{ nxt_string(";"),
nxt_string("undefined") },
{ nxt_string("\n +1"),
nxt_string("1") },
/* Number.toString(radix) method. */
{ nxt_string("0..toString(2)"),
nxt_string("0") },
{ nxt_string("240..toString(2)"),
nxt_string("11110000") },
{ nxt_string("Math.pow(-2, 1023).toString(2).length"),
nxt_string("1025") },
{ nxt_string("8.0625.toString(2)"),
nxt_string("1000.0001") },
{ nxt_string("(1/3).toString(2)"),
nxt_string("0.010101010101010101010101010101010101010101010101010101") },
{ nxt_string("9999..toString(3)"),
nxt_string("111201100") },
{ nxt_string("-9999..toString(3)"),
nxt_string("-111201100") },
{ nxt_string("81985529216486895..toString(16)"),
nxt_string("123456789abcdf0") },
{ nxt_string("1845449130881..toString(36)"),
nxt_string("njscript") },
/* An object "valueOf/toString" methods. */
{ nxt_string("var a = { valueOf: function() { return 1 } }; +a"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return '1' } }; +a"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: 2,"
" toString: function() { return '1' } }; +a"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return [] },"
" toString: function() { return '1' } }; +a"),
nxt_string("1") },
{ nxt_string("var a = { toString: function() { return 'a' } };"
"var b = { toString: function() { return a+'b' } }; '0'+b"),
nxt_string("0ab") },
/**/
{ nxt_string("1 + undefined"),
nxt_string("NaN") },
{ nxt_string("1 + ''"),
nxt_string("1") },
{ nxt_string("undefined + undefined"),
nxt_string("NaN") },
{ nxt_string("1.2 + 5.7"),
nxt_string("6.9") },
{ nxt_string("1 + 1 + '2' + 1 + 1"),
nxt_string("2211") },
{ nxt_string("1.2 - '5.7'"),
nxt_string("-4.5") },
{ nxt_string("1.2 + -'5.7'"),
nxt_string("-4.5") },
{ nxt_string("1 + +'3'"),
nxt_string("4") },
{ nxt_string("1 - undefined"),
nxt_string("NaN") },
{ nxt_string("1 - ''"),
nxt_string("1") },
{ nxt_string("undefined - undefined"),
nxt_string("NaN") },
/* Assignment. */
{ nxt_string("var a, b = (a = [2]) * (3 * 4); a +' '+ b"),
nxt_string("2 24") },
/* 3 address operation and side effect. */
{ nxt_string("var a = 1; function f(x) { a = x; return 2 }; a+f(5)+' '+a"),
nxt_string("3 5") },
{ nxt_string("var a = 1; function f(x) { a = x; return 2 }; a += f(5)"),
nxt_string("3") },
/**/
{ nxt_string("12 | 6"),
nxt_string("14") },
{ nxt_string("12 | 'abc'"),
nxt_string("12") },
{ nxt_string("-1 | 0"),
nxt_string("-1") },
{ nxt_string("-2147483648 | 0"),
nxt_string("-2147483648") },
{ nxt_string("1024.9 | 0"),
nxt_string("1024") },
{ nxt_string("-1024.9 | 0"),
nxt_string("-1024") },
{ nxt_string("9007199254740991 | 0"),
nxt_string("-1") },
{ nxt_string("9007199254740992 | 0"),
nxt_string("0") },
{ nxt_string("9007199254740993 | 0"),
nxt_string("0") },
#if 0
{ nxt_string("9223372036854775808 | 0"),
nxt_string("0") },
#endif
{ nxt_string("9223372036854777856 | 0"),
nxt_string("2048") },
{ nxt_string("-9223372036854777856 | 0"),
nxt_string("-2048") },
{ nxt_string("NaN | 0"),
nxt_string("0") },
{ nxt_string("-NaN | 0"),
nxt_string("0") },
{ nxt_string("Infinity | 0"),
nxt_string("0") },
{ nxt_string("-Infinity | 0"),
nxt_string("0") },
{ nxt_string("+0 | 0"),
nxt_string("0") },
{ nxt_string("-0 | 0"),
nxt_string("0") },
{ nxt_string("32.5 << 2.4"),
nxt_string("128") },
{ nxt_string("32.5 << 'abc'"),
nxt_string("32") },
{ nxt_string("'abc' << 2"),
nxt_string("0") },
{ nxt_string("-1 << 0"),
nxt_string("-1") },
{ nxt_string("-1 << -1"),
nxt_string("-2147483648") },
{ nxt_string("-2147483648 << 0"),
nxt_string("-2147483648") },
#if 0
{ nxt_string("9223372036854775808 << 0"),
nxt_string("0") },
#endif
{ nxt_string("9223372036854777856 << 0"),
nxt_string("2048") },
{ nxt_string("-9223372036854777856 << 0"),
nxt_string("-2048") },
{ nxt_string("NaN << 0"),
nxt_string("0") },
{ nxt_string("32.5 >> 2.4"),
nxt_string("8") },
{ nxt_string("-1 >> 30"),
nxt_string("-1") },
{ nxt_string("'abc' >> 2"),
nxt_string("0") },
{ nxt_string("-1 >> 0"),
nxt_string("-1") },
{ nxt_string("-1 >> -1"),
nxt_string("-1") },
{ nxt_string("-2147483648 >> 0"),
nxt_string("-2147483648") },
{ nxt_string("-2147483648 >> -1"),
nxt_string("-1") },
#if 0
{ nxt_string("9223372036854775808 >> 0"),
nxt_string("0") },
#endif
{ nxt_string("9223372036854777856 >> 0"),
nxt_string("2048") },
{ nxt_string("-9223372036854777856 >> 0"),
nxt_string("-2048") },
{ nxt_string("NaN >> 0"),
nxt_string("0") },
{ nxt_string("-1 >>> 30"),
nxt_string("3") },
{ nxt_string("NaN >>> 1"),
nxt_string("0") },
#if 0
{ nxt_string("9223372036854775808 >>> 1"),
nxt_string("0") },
#endif
{ nxt_string("-1 >>> 0"),
nxt_string("4294967295") },
{ nxt_string("-1 >>> -1"),
nxt_string("1") },
{ nxt_string("-2147483648 >>> 0"),
nxt_string("2147483648") },
{ nxt_string("-2147483648 >>> -1"),
nxt_string("1") },
#if 0
{ nxt_string("9223372036854775808 >>> 0"),
nxt_string("0") },
#endif
{ nxt_string("9223372036854777856 >>> 0"),
nxt_string("2048") },
{ nxt_string("-9223372036854777856 >>> 0"),
nxt_string("4294965248") },
{ nxt_string("NaN >>> 0"),
nxt_string("0") },
{ nxt_string("!2"),
nxt_string("false") },
/**/
{ nxt_string("var a = { valueOf: function() { return 1 } }; ~a"),
nxt_string("-2") },
{ nxt_string("var a = { valueOf: function() { return '1' } }; ~a"),
nxt_string("-2") },
/**/
{ nxt_string("1 || 2"),
nxt_string("1") },
{ nxt_string("var a = 1; 1 || (a = 2); a"),
nxt_string("1") },
{ nxt_string("1 || 2 || 3"),
nxt_string("1") },
{ nxt_string("1 || (2 + 2) || 3"),
nxt_string("1") },
{ nxt_string("1 && 2"),
nxt_string("2") },
{ nxt_string("1 && 2 && 3"),
nxt_string("3") },
{ nxt_string("var a = 1; 0 && (a = 2); a"),
nxt_string("1") },
{ nxt_string("false && true || true"),
nxt_string("true") },
{ nxt_string("false && (true || true)"),
nxt_string("false") },
{ nxt_string("a = true; a = -~!a"),
nxt_string("1") },
{ nxt_string("12 & 6"),
nxt_string("4") },
{ nxt_string("-1 & 65536"),
nxt_string("65536") },
{ nxt_string("-2147483648 & 65536"),
nxt_string("0") },
#if 0
{ nxt_string("9223372036854775808 & 65536"),
nxt_string("0") },
#endif
{ nxt_string("NaN & 65536"),
nxt_string("0") },
{ nxt_string("12 ^ 6"),
nxt_string("10") },
{ nxt_string("-1 ^ 65536"),
nxt_string("-65537") },
{ nxt_string("-2147483648 ^ 65536"),
nxt_string("-2147418112") },
#if 0
{ nxt_string("9223372036854775808 ^ 65536"),
nxt_string("65536") },
#endif
{ nxt_string("NaN ^ 65536"),
nxt_string("65536") },
{ nxt_string("x = '1'; +x + 2"),
nxt_string("3") },
{ nxt_string("'3' -+-+-+ '1' + '1' / '3' * '6' + '2'"),
nxt_string("42") },
{ nxt_string("((+!![])+(+!![])+(+!![])+(+!![])+[])+((+!![])+(+!![])+[])"),
nxt_string("42") },
{ nxt_string("1+[[]+[]]-[]+[[]-[]]-1"),
nxt_string("9") },
{ nxt_string("[[]+[]]-[]+[[]-[]]"),
nxt_string("00") },
{ nxt_string("'true' == true"),
nxt_string("false") },
{ nxt_string("null == false"),
nxt_string("false") },
{ nxt_string("!null"),
nxt_string("true") },
{ nxt_string("0 === -0"),
nxt_string("true") },
{ nxt_string("1/-0"),
nxt_string("-Infinity") },
{ nxt_string("1/0 === 1/-0"),
nxt_string("false") },
{ nxt_string("1 == true"),
nxt_string("true") },
{ nxt_string("NaN === NaN"),
nxt_string("false") },
{ nxt_string("NaN !== NaN"),
nxt_string("true") },
{ nxt_string("NaN == NaN"),
nxt_string("false") },
{ nxt_string("NaN != NaN"),
nxt_string("true") },
{ nxt_string("NaN == false"),
nxt_string("false") },
{ nxt_string("Infinity == Infinity"),
nxt_string("true") },
{ nxt_string("-Infinity == -Infinity"),
nxt_string("true") },
{ nxt_string("-Infinity < Infinity"),
nxt_string("true") },
{ nxt_string("Infinity - Infinity"),
nxt_string("NaN") },
{ nxt_string("Infinity - -Infinity"),
nxt_string("Infinity") },
{ nxt_string("undefined == 0"),
nxt_string("false") },
{ nxt_string("undefined == null"),
nxt_string("true") },
{ nxt_string("'1' == 1"),
nxt_string("true") },
{ nxt_string("'1a' == '1'"),
nxt_string("false") },
{ nxt_string("'abc' == 'abc'"),
nxt_string("true") },
{ nxt_string("'abc' < 'abcde'"),
nxt_string("true") },
{ nxt_string("0 == ''"),
nxt_string("true") },
{ nxt_string("0 == ' '"),
nxt_string("true") },
{ nxt_string("0 == ' '"),
nxt_string("true") },
{ nxt_string("0 == '0'"),
nxt_string("true") },
{ nxt_string("0 == ' 0 '"),
nxt_string("true") },
{ nxt_string("0 == '000'"),
nxt_string("true") },
{ nxt_string("'0' == ''"),
nxt_string("false") },
{ nxt_string("1 < 2"),
nxt_string("true") },
{ nxt_string("NaN < NaN"),
nxt_string("false") },
{ nxt_string("NaN > NaN"),
nxt_string("false") },
{ nxt_string("undefined < 1"),
nxt_string("false") },
{ nxt_string("[] == false"),
nxt_string("true") },
{ nxt_string("[0] == false"),
nxt_string("true") },
{ nxt_string("[0,0] == false"),
nxt_string("false") },
{ nxt_string("({}) == false"),
nxt_string("false") },
{ nxt_string("var a = { valueOf: function() { return 5 } }; a == 5"),
nxt_string("true") },
{ nxt_string("var a = { valueOf: function() { return '5' } }; a == 5"),
nxt_string("true") },
{ nxt_string("var a = { valueOf: function() { return '5' } }; a == '5'"),
nxt_string("true") },
/* Comparisions. */
{ nxt_string("1 < 2"),
nxt_string("true") },
{ nxt_string("1 < 1"),
nxt_string("false") },
{ nxt_string("1 <= 1"),
nxt_string("true") },
{ nxt_string("1 <= 2"),
nxt_string("true") },
{ nxt_string("2 > 1"),
nxt_string("true") },
{ nxt_string("1 > 2"),
nxt_string("false") },
{ nxt_string("1 > 1"),
nxt_string("false") },
{ nxt_string("1 >= 1"),
nxt_string("true") },
{ nxt_string("2 >= 1"),
nxt_string("true") },
{ nxt_string("1 >= 2"),
nxt_string("false") },
/**/
{ nxt_string("null === null"),
nxt_string("true") },
{ nxt_string("null !== null"),
nxt_string("false") },
{ nxt_string("null == null"),
nxt_string("true") },
{ nxt_string("null != null"),
nxt_string("false") },
{ nxt_string("null < null"),
nxt_string("false") },
{ nxt_string("null > null"),
nxt_string("false") },
{ nxt_string("null <= null"),
nxt_string("true") },
{ nxt_string("null >= null"),
nxt_string("true") },
/**/
{ nxt_string("null === undefined"),
nxt_string("false") },
{ nxt_string("null !== undefined"),
nxt_string("true") },
{ nxt_string("null == undefined"),
nxt_string("true") },
{ nxt_string("null != undefined"),
nxt_string("false") },
{ nxt_string("null < undefined"),
nxt_string("false") },
{ nxt_string("null > undefined"),
nxt_string("false") },
{ nxt_string("null <= undefined"),
nxt_string("false") },
{ nxt_string("null >= undefined"),
nxt_string("false") },
/**/
{ nxt_string("null === false"),
nxt_string("false") },
{ nxt_string("null !== false"),
nxt_string("true") },
{ nxt_string("null == false"),
nxt_string("false") },
{ nxt_string("null != false"),
nxt_string("true") },
{ nxt_string("null < false"),
nxt_string("false") },
{ nxt_string("null > false"),
nxt_string("false") },
{ nxt_string("null <= false"),
nxt_string("true") },
{ nxt_string("null >= false"),
nxt_string("true") },
/**/
{ nxt_string("null === true"),
nxt_string("false") },
{ nxt_string("null !== true"),
nxt_string("true") },
{ nxt_string("null == true"),
nxt_string("false") },
{ nxt_string("null != true"),
nxt_string("true") },
{ nxt_string("null < true"),
nxt_string("true") },
{ nxt_string("null > true"),
nxt_string("false") },
{ nxt_string("null <= true"),
nxt_string("true") },
{ nxt_string("null >= true"),
nxt_string("false") },
/**/
{ nxt_string("Infinity === Infinity"),
nxt_string("true") },
{ nxt_string("Infinity !== Infinity"),
nxt_string("false") },
{ nxt_string("Infinity == Infinity"),
nxt_string("true") },
{ nxt_string("Infinity != Infinity"),
nxt_string("false") },
{ nxt_string("Infinity < Infinity"),
nxt_string("false") },
{ nxt_string("Infinity > Infinity"),
nxt_string("false") },
{ nxt_string("Infinity <= Infinity"),
nxt_string("true") },
{ nxt_string("Infinity >= Infinity"),
nxt_string("true") },
/**/
{ nxt_string("-Infinity === Infinity"),
nxt_string("false") },
{ nxt_string("-Infinity !== Infinity"),
nxt_string("true") },
{ nxt_string("-Infinity == Infinity"),
nxt_string("false") },
{ nxt_string("-Infinity != Infinity"),
nxt_string("true") },
{ nxt_string("-Infinity < Infinity"),
nxt_string("true") },
{ nxt_string("-Infinity > Infinity"),
nxt_string("false") },
{ nxt_string("-Infinity <= Infinity"),
nxt_string("true") },
{ nxt_string("-Infinity >= Infinity"),
nxt_string("false") },
/**/
{ nxt_string("NaN === NaN"),
nxt_string("false") },
{ nxt_string("NaN !== NaN"),
nxt_string("true") },
{ nxt_string("NaN == NaN"),
nxt_string("false") },
{ nxt_string("NaN != NaN"),
nxt_string("true") },
{ nxt_string("NaN < NaN"),
nxt_string("false") },
{ nxt_string("NaN > NaN"),
nxt_string("false") },
{ nxt_string("NaN >= NaN"),
nxt_string("false") },
{ nxt_string("NaN <= NaN"),
nxt_string("false") },
/**/
{ nxt_string("null < 0"),
nxt_string("false") },
{ nxt_string("null < 1"),
nxt_string("true") },
{ nxt_string("null < NaN"),
nxt_string("false") },
{ nxt_string("null < -Infinity"),
nxt_string("false") },
{ nxt_string("null < Infinity"),
nxt_string("true") },
{ nxt_string("null < 'null'"),
nxt_string("false") },
{ nxt_string("null < '1'"),
nxt_string("true") },
{ nxt_string("null < [1]"),
nxt_string("true") },
{ nxt_string("null < ({})"),
nxt_string("false") },
{ nxt_string("var a = { valueOf: function() { return 1 } } null < a"),
nxt_string("true") },
{ nxt_string("var a = { valueOf: function() { return 'null' } } null < a"),
nxt_string("false") },
{ nxt_string("var a = { valueOf: function() { return '1' } } null < a"),
nxt_string("true") },
/**/
{ nxt_string("undefined < null"),
nxt_string("false") },
{ nxt_string("undefined < undefined"),
nxt_string("false") },
{ nxt_string("undefined < false"),
nxt_string("false") },
{ nxt_string("undefined < true"),
nxt_string("false") },
{ nxt_string("undefined < 0"),
nxt_string("false") },
{ nxt_string("undefined < 1"),
nxt_string("false") },
{ nxt_string("undefined < NaN"),
nxt_string("false") },
{ nxt_string("undefined < -Infinity"),
nxt_string("false") },
{ nxt_string("undefined < Infinity"),
nxt_string("false") },
{ nxt_string("undefined < 'undefined'"),
nxt_string("false") },
{ nxt_string("undefined < '1'"),
nxt_string("false") },
{ nxt_string("undefined < [1]"),
nxt_string("false") },
{ nxt_string("undefined < ({})"),
nxt_string("false") },
{ nxt_string("var a = { valueOf: function() { return 1 } } undefined < a"),
nxt_string("false") },
{ nxt_string("var a = { valueOf: function() { return 'undefined' } }"
"undefined < a"),
nxt_string("false") },
{ nxt_string("var a = { valueOf: function() { return '1' } }"
"undefined < a"),
nxt_string("false") },
/**/
{ nxt_string("false < 1"),
nxt_string("true") },
{ nxt_string("true < 1"),
nxt_string("false") },
{ nxt_string("-1 < 1"),
nxt_string("true") },
{ nxt_string("-1 < '1'"),
nxt_string("true") },
{ nxt_string("NaN < NaN"),
nxt_string("false") },
{ nxt_string("-Infinity < Infinity"),
nxt_string("true") },
{ nxt_string("Infinity < -Infinity"),
nxt_string("false") },
{ nxt_string("1 < 'abc'"),
nxt_string("false") },
/**/
{ nxt_string("[] === []"),
nxt_string("false") },
{ nxt_string("[] !== []"),
nxt_string("true") },
{ nxt_string("[] == []"),
nxt_string("false") },
{ nxt_string("[] != []"),
nxt_string("true") },
{ nxt_string("[] < []"),
nxt_string("false") },
{ nxt_string("[] > []"),
nxt_string("false") },
{ nxt_string("[] >= []"),
nxt_string("true") },
{ nxt_string("[] <= []"),
nxt_string("true") },
/**/
{ nxt_string("({}) === ({})"),
nxt_string("false") },
{ nxt_string("({}) !== ({})"),
nxt_string("true") },
{ nxt_string("({}) == ({})"),
nxt_string("false") },
{ nxt_string("({}) != ({})"),
nxt_string("true") },
{ nxt_string("({}) > ({})"),
nxt_string("false") },
{ nxt_string("({}) <= ({})"),
nxt_string("true") },
{ nxt_string("({}) >= ({})"),
nxt_string("true") },
/**/
{ nxt_string("[0] == ({})"),
nxt_string("false") },
{ nxt_string("[0] != ({})"),
nxt_string("true") },
{ nxt_string("[0] <= ({})"),
nxt_string("true") },
{ nxt_string("[0] >= ({})"),
nxt_string("false") },
/**/
{ nxt_string("a = 1 ? 2 : 3"),
nxt_string("2") },
{ nxt_string("a = 1 ? 2 : 3 ? 4 : 5"),
nxt_string("2") },
{ nxt_string("a = 0 ? 2 : 3 ? 4 : 5"),
nxt_string("4") },
{ nxt_string("0 ? 2 ? 3 : 4 : 5"),
nxt_string("5") },
{ nxt_string("1 ? 2 ? 3 : 4 : 5"),
nxt_string("3") },
{ nxt_string("1 ? 0 ? 3 : 4 : 5"),
nxt_string("4") },
{ nxt_string("(1 ? 0 : 3) ? 4 : 5"),
nxt_string("5") },
{ nxt_string("a = (1 + 2) ? 2 ? 3 + 4 : 5 : 6"),
nxt_string("7") },
{ nxt_string("a = (1 ? 2 : 3) + 4"),
nxt_string("6") },
{ nxt_string("a = 1 ? b = 2 + 4 : b = 3"),
nxt_string("6") },
{ nxt_string("a = 1 ? [1,2] : []"),
nxt_string("1,2") },
/**/
{ nxt_string("var a = { valueOf: function() { return 1 } }; +a"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return '1' } }; +a"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return 1 } }; -a"),
nxt_string("-1") },
{ nxt_string("var a = { valueOf: function() { return '1' } }; -a"),
nxt_string("-1") },
/* Increment. */
{ nxt_string("var a = 1; ++a"),
nxt_string("2") },
{ nxt_string("var a = '1'; ++a"),
nxt_string("2") },
{ nxt_string("var a = [1]; ++a"),
nxt_string("2") },
{ nxt_string("var a = {}; ++a"),
nxt_string("NaN") },
{ nxt_string("var a = [1,2,3]; var b = 1; b = ++a[b]; b + ' '+ a"),
nxt_string("3 1,3,3") },
{ nxt_string("var a = { valueOf: function() { return 1 } };"
"++a +' '+ a +' '+ typeof a"),
nxt_string("2 2 number") },
{ nxt_string("var a = { valueOf: function() { return '1' } };"
"++a +' '+ a +' '+ typeof a"),
nxt_string("2 2 number") },
{ nxt_string("var a = { valueOf: function() { return [1] } };"
"++a +' '+ a +' '+ typeof a"),
nxt_string("NaN NaN number") },
{ nxt_string("var a = { valueOf: function() { return {} } };"
"++a +' '+ a +' '+ typeof a"),
nxt_string("NaN NaN number") },
/**/
{ nxt_string("var a = 1; a = ++a"),
nxt_string("2") },
{ nxt_string("var a = '1'; a = ++a"),
nxt_string("2") },
{ nxt_string("var a = [1]; a = ++a"),
nxt_string("2") },
{ nxt_string("var a = {}; a = ++a"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return 1 } } a = ++a"),
nxt_string("2") },
{ nxt_string("var a = { valueOf: function() { return '1' } } a = ++a"),
nxt_string("2") },
{ nxt_string("var a = { valueOf: function() { return [1] } } a = ++a"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return {} } } a = ++a"),
nxt_string("NaN") },
/**/
{ nxt_string("var a = 1; var b = ++a; a +' '+ b"),
nxt_string("2 2") },
{ nxt_string("var a = '1'; var b = ++a; a +' '+ b"),
nxt_string("2 2") },
{ nxt_string("var a = [1]; var b = ++a; a +' '+ b"),
nxt_string("2 2") },
{ nxt_string("var a = {}; var b = ++a; a +' '+ b"),
nxt_string("NaN NaN") },
{ nxt_string("var a = { valueOf: function() { return 1 } }"
"var b = ++a; a +' '+ b"),
nxt_string("2 2") },
{ nxt_string("var a = { valueOf: function() { return '1' } }"
"var b = ++a; a +' '+ b"),
nxt_string("2 2") },
{ nxt_string("var a = { valueOf: function() { return [1] } }"
"var b = ++a; a +' '+ b"),
nxt_string("NaN NaN") },
{ nxt_string("var a = { valueOf: function() { return {} } }"
"var b = ++a; a +' '+ b"),
nxt_string("NaN NaN") },
/* Post increment. */
{ nxt_string("var a = 1; a++"),
nxt_string("1") },
{ nxt_string("var a = '1'; a++"),
nxt_string("1") },
{ nxt_string("var a = [1]; a++"),
nxt_string("1") },
{ nxt_string("var a = {}; a++"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return 1 } } a++"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return '1' } } a++"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return [1] } } a++"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return {} } } a++"),
nxt_string("NaN") },
/**/
{ nxt_string("var a = 1; a = a++"),
nxt_string("1") },
{ nxt_string("var a = '1'; a = a++"),
nxt_string("1") },
{ nxt_string("var a = [1]; a = a++"),
nxt_string("1") },
{ nxt_string("var a = {}; a = a++"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return 1 } } a = a++"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return '1' } } a = a++"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return [1] } } a = a++"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return {} } } a = a++"),
nxt_string("NaN") },
/**/
{ nxt_string("var a = 1; var b = a++; a +' '+ b"),
nxt_string("2 1") },
{ nxt_string("var a = '1'; var b = a++; a +' '+ b"),
nxt_string("2 1") },
{ nxt_string("var a = [1]; var b = a++; a +' '+ b"),
nxt_string("2 1") },
{ nxt_string("var a = {}; var b = a++; a +' '+ b"),
nxt_string("NaN NaN") },
{ nxt_string("var a = { valueOf: function() { return 1 } }"
"var b = a++; a +' '+ b"),
nxt_string("2 1") },
{ nxt_string("var a = { valueOf: function() { return '1' } }"
"var b = a++; a +' '+ b"),
nxt_string("2 1") },
{ nxt_string("var a = { valueOf: function() { return [1] } }"
"var b = a++; a +' '+ b"),
nxt_string("NaN NaN") },
{ nxt_string("var a = { valueOf: function() { return {} } }"
"var b = a++; a +' '+ b"),
nxt_string("NaN NaN") },
/* Decrement. */
{ nxt_string("var a = 1; --a"),
nxt_string("0") },
{ nxt_string("var a = '1'; --a"),
nxt_string("0") },
{ nxt_string("var a = [1]; --a"),
nxt_string("0") },
{ nxt_string("var a = {}; --a"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return 1} }; --a"),
nxt_string("0") },
{ nxt_string("var a = { valueOf: function() { return '1'} }; --a"),
nxt_string("0") },
{ nxt_string("var a = { valueOf: function() { return [1]} }; --a"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return {} } }; --a"),
nxt_string("NaN") },
/**/
{ nxt_string("var a = 1; a = --a"),
nxt_string("0") },
{ nxt_string("var a = '1'; a = --a"),
nxt_string("0") },
{ nxt_string("var a = [1]; a = --a"),
nxt_string("0") },
{ nxt_string("var a = {}; a = --a"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return 1} } a = --a"),
nxt_string("0") },
{ nxt_string("var a = { valueOf: function() { return '1'} } a = --a"),
nxt_string("0") },
{ nxt_string("var a = { valueOf: function() { return [1]} } a = --a"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return {} } } a = --a"),
nxt_string("NaN") },
/**/
{ nxt_string("var a = 1; var b = --a; a +' '+ b"),
nxt_string("0 0") },
{ nxt_string("var a = '1'; var b = --a; a +' '+ b"),
nxt_string("0 0") },
{ nxt_string("var a = [1]; var b = --a; a +' '+ b"),
nxt_string("0 0") },
{ nxt_string("var a = {}; var b = --a; a +' '+ b"),
nxt_string("NaN NaN") },
{ nxt_string("var a = { valueOf: function() { return 1 } }"
"var b = --a; a +' '+ b"),
nxt_string("0 0") },
{ nxt_string("var a = { valueOf: function() { return '1' } }"
"var b = --a; a +' '+ b"),
nxt_string("0 0") },
{ nxt_string("var a = { valueOf: function() { return [1] } }"
"var b = --a; a +' '+ b"),
nxt_string("NaN NaN") },
{ nxt_string("var a = { valueOf: function() { return {} } }"
"var b = --a; a +' '+ b"),
nxt_string("NaN NaN") },
/* Post decrement. */
{ nxt_string("var a = 1; a--"),
nxt_string("1") },
{ nxt_string("var a = '1'; a--"),
nxt_string("1") },
{ nxt_string("var a = [1]; a--"),
nxt_string("1") },
{ nxt_string("var a = {}; a--"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return 1 } } a--"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return '1' } } a--"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return [1] } } a--"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return {} } } a--"),
nxt_string("NaN") },
/**/
{ nxt_string("var a = 1; a = a--"),
nxt_string("1") },
{ nxt_string("var a = '1'; a = a--"),
nxt_string("1") },
{ nxt_string("var a = [1]; a = a--"),
nxt_string("1") },
{ nxt_string("var a = {}; a = a--"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return 1 } } a = a--"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return '1' } } a = a--"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return [1] } } a = a--"),
nxt_string("NaN") },
{ nxt_string("var a = { valueOf: function() { return {} } } a = a--"),
nxt_string("NaN") },
/**/
{ nxt_string("var a = 1; var b = a--; a +' '+ b"),
nxt_string("0 1") },
{ nxt_string("var a = '1'; var b = a--; a +' '+ b"),
nxt_string("0 1") },
{ nxt_string("var a = [1]; var b = a--; a +' '+ b"),
nxt_string("0 1") },
{ nxt_string("var a = {}; var b = a--; a +' '+ b"),
nxt_string("NaN NaN") },
{ nxt_string("var a = { valueOf: function() { return 1 } }"
"var b = a--; a +' '+ b"),
nxt_string("0 1") },
{ nxt_string("var a = { valueOf: function() { return '1' } }"
"var b = a--; a +' '+ b"),
nxt_string("0 1") },
{ nxt_string("var a = { valueOf: function() { return [1] } }"
"var b = a--; a +' '+ b"),
nxt_string("NaN NaN") },
{ nxt_string("var a = { valueOf: function() { return {} } }"
"var b = a--; a +' '+ b"),
nxt_string("NaN NaN") },
/**/
{ nxt_string("a = 2; b = ++a + ++a; a + ' ' + b"),
nxt_string("4 7") },
{ nxt_string("a = 2; b = a++ + a++; a + ' ' + b"),
nxt_string("4 5") },
{ nxt_string("a = b = 7; a +' '+ b"),
nxt_string("7 7") },
{ nxt_string("a = b = c = 5; a +' '+ b +' '+ c"),
nxt_string("5 5 5") },
{ nxt_string("a = b = (c = 5) + 2; a +' '+ b +' '+ c"),
nxt_string("7 7 5") },
{ nxt_string("1, 2 + 5, 3"),
nxt_string("3") },
{ nxt_string("a = 1 /* YES */\n b = a + 2 \n \n + 1 \n + 3"),
nxt_string("7") },
{ nxt_string("a = 1 // YES \n b = a + 2 \n \n + 1 \n + 3"),
nxt_string("7") },
{ nxt_string("a = 0; ++ \n a"),
nxt_string("1") },
{ nxt_string("a = 0; a \n ++"),
nxt_string("SyntaxError: Unexpected end of input in 2") },
{ nxt_string("a = 1 ? 2 \n : 3"),
nxt_string("2") },
{ nxt_string("a = 0 / 0; b = 1 / 0; c = -1 / 0; a +' '+ b +' '+ c"),
nxt_string("NaN Infinity -Infinity") },
{ nxt_string("a = (b = 7) + 5; var c; a +' '+ b +' '+ c"),
nxt_string("12 7 undefined") },
{ nxt_string("var a, b = 1, c; a +' '+ b +' '+ c"),
nxt_string("undefined 1 undefined") },
{ nxt_string("var a = 1, b = a + 1; a +' '+ b"),
nxt_string("1 2") },
{ nxt_string("a = a = 1"),
nxt_string("1") },
{ nxt_string("var a = 1, \n b; a +' '+ b"),
nxt_string("1 undefined") },
{ nxt_string("a = b + 1; var b; a +' '+ b"),
nxt_string("NaN undefined") },
{ nxt_string("var a += 1"),
nxt_string("SyntaxError: Unexpected token \"+=\" in 1") },
{ nxt_string("var a = a + 1"),
nxt_string("undefined") },
{ nxt_string("a = b + 1; var b = 1; a +' '+ b"),
nxt_string("NaN 1") },
{ nxt_string("(a) = 1"),
nxt_string("1") },
{ nxt_string("a"),
nxt_string("ReferenceError") },
{ nxt_string("a + a"),
nxt_string("ReferenceError") },
{ nxt_string("a = b + 1"),
nxt_string("ReferenceError") },
{ nxt_string("a = a + 1"),
nxt_string("ReferenceError") },
{ nxt_string("a += 1"),
nxt_string("ReferenceError") },
{ nxt_string("a += 1; var a = 2"),
nxt_string("undefined") },
{ nxt_string("var a = 1"),
nxt_string("undefined") },
{ nxt_string("var a = 1; a = (a = 2) + a"),
nxt_string("4") },
{ nxt_string("var a = 1; a = a + (a = 2)"),
nxt_string("3") },
{ nxt_string("var a = 1; a += (a = 2)"),
nxt_string("3") },
{ nxt_string("var a = b = 1; a +' '+ b"),
nxt_string("1 1") },
{ nxt_string("var a \n if (!a) a = 3; a"),
nxt_string("3") },
/* if. */
{ nxt_string("if (0);"),
nxt_string("undefined") },
{ nxt_string("if (0) {}"),
nxt_string("undefined") },
{ nxt_string("if (0);else;"),
nxt_string("undefined") },
{ nxt_string("var a = 1; if (true); else a = 2; a"),
nxt_string("1") },
{ nxt_string("var a = 1; if (false); else a = 2; a"),
nxt_string("2") },
{ nxt_string("var a = 1; if (true) a = 2; else a = 3; a"),
nxt_string("2") },
{ nxt_string("var a = 3; if (true) if (false); else a = 2; a"),
nxt_string("2") },
{ nxt_string("var a = 3; if (true) if (false); else; a = 2; a"),
nxt_string("2") },
{ nxt_string("var a = [3], b; if (1==1||2==2) { b = '1'+'2'+a[0] }; b }"),
nxt_string("123") },
/* do while. */
{ nxt_string("do { break } if (false)"),
nxt_string("SyntaxError: Unexpected token \"if\" in 1") },
/* for in. */
{ nxt_string("for (null in undefined);"),
nxt_string("ReferenceError: Invalid left-hand side \"null\" in for-in statement in 1") },
/* switch. */
{ nxt_string("switch"),
nxt_string("SyntaxError: Unexpected end of input in 1") },
{ nxt_string("switch (1);"),
nxt_string("SyntaxError: Unexpected token \";\" in 1") },
{ nxt_string("switch (1) { do { } while (1) }"),
nxt_string("SyntaxError: Unexpected token \"do\" in 1") },
{ nxt_string("switch (1) {}"),
nxt_string("undefined") },
{ nxt_string("switch (1) {default:}"),
nxt_string("undefined") },
{ nxt_string("switch (1) {case 0:}"),
nxt_string("undefined") },
{ nxt_string("switch (1) {default:;}"),
nxt_string("undefined") },
{ nxt_string("switch (1) {default:; default:}"),
nxt_string("SyntaxError: More than one default clause in switch statement in 1") },
{ nxt_string("switch (1) {case 0:;}"),
nxt_string("undefined") },
{ nxt_string("var a = 'A'; switch (a) {"
"case 0: a += '0';"
"case 1: a += '1';"
"}; a"),
nxt_string("A") },
{ nxt_string("var a = 'A'; switch (0) {"
"case 0: a += '0';"
"case 1: a += '1';"
"}; a"),
nxt_string("A01") },
{ nxt_string("var a = 'A'; switch (0) {"
"case 0: a += '0'; break;"
"case 1: a += '1';"
"}; a"),
nxt_string("A0") },
{ nxt_string("var a = 'A'; switch (1) {"
"case 0: a += '0';"
"case 1: a += '1';"
"}; a"),
nxt_string("A1") },
{ nxt_string("var a = 'A'; switch (2) {"
"case 0: a += '0';"
"case 1: a += '1';"
"default: a += 'D';"
"}; a"),
nxt_string("AD") },
{ nxt_string("var a = 'A'; switch (2) {"
"case 0: a += '0';"
"default: a += 'D';"
"case 1: a += '1';"
"}; a"),
nxt_string("AD1") },
{ nxt_string("var a = 'A'; function f(x) { a += x; return 0 }"
"switch (a) {"
"case f(1):"
"default:"
"case f(2): a += 'D';"
"case f(3): a += 'T';"
"} a"),
nxt_string("A123DT") },
/* continue. */
{ nxt_string("continue"),
nxt_string("SyntaxError: Illegal continue statement in 1") },
{ nxt_string("do continue while (false)"),
nxt_string("SyntaxError: Unexpected token \"while\" in 1") },
{ nxt_string("do continue; while (false)"),
nxt_string("undefined") },
{ nxt_string("do { continue } while (false)"),
nxt_string("undefined") },
{ nxt_string("var i = 0; do if (i++ > 9) continue; while (i < 100); i"),
nxt_string("100") },
{ nxt_string("while (false) continue"),
nxt_string("undefined") },
{ nxt_string("while (false) continue;"),
nxt_string("undefined") },
{ nxt_string("while (false) { continue }"),
nxt_string("undefined") },
{ nxt_string("var i = 0; while (i < 100) if (i++ > 9) continue; i"),
nxt_string("100") },
{ nxt_string("for ( ;null; ) continue"),
nxt_string("undefined") },
{ nxt_string("for ( ;null; ) continue;"),
nxt_string("undefined") },
{ nxt_string("for ( ;null; ) { continue }"),
nxt_string("undefined") },
{ nxt_string("for (i = 0; i < 100; i++) if (i > 9) continue; i"),
nxt_string("100") },
{ nxt_string("var a = []; for (i in a) continue"),
nxt_string("undefined") },
{ nxt_string("var a = []; for (i in a) continue;"),
nxt_string("undefined") },
{ nxt_string("var a = []; for (i in a) { continue }"),
nxt_string("undefined") },
{ nxt_string("var a = [1,2,3,4,5]; var s = 0;"
"for (i in a) { if (a[i] > 4) continue; else s += a[i] } s"),
nxt_string("10") },
{ nxt_string("var a = [1,2,3,4,5]; var s = 0;"
"for (i in a) { if (a[i] > 4) continue; s += a[i] } s"),
nxt_string("10") },
/* break. */
{ nxt_string("break"),
nxt_string("SyntaxError: Illegal break statement in 1") },
{ nxt_string("do break while (true)"),
nxt_string("SyntaxError: Unexpected token \"while\" in 1") },
{ nxt_string("do break; while (true)"),
nxt_string("undefined") },
{ nxt_string("do { break } while (true)"),
nxt_string("undefined") },
{ nxt_string("var i = 0; do if (i++ > 9) break; while (i < 100); i"),
nxt_string("11") },
{ nxt_string("while (true) break"),
nxt_string("undefined") },
{ nxt_string("while (true) break;"),
nxt_string("undefined") },
{ nxt_string("while (true) { break }"),
nxt_string("undefined") },
{ nxt_string("var i = 0; while (i < 100) if (i++ > 9) break; i"),
nxt_string("11") },
{ nxt_string("for ( ;; ) break"),
nxt_string("undefined") },
{ nxt_string("for ( ;; ) break;"),
nxt_string("undefined") },
{ nxt_string("for ( ;; ) { break }"),
nxt_string("undefined") },
{ nxt_string("for (i = 0; i < 100; i++) if (i > 9) break; i"),
nxt_string("10") },
{ nxt_string("var a = []; for (i in a) break"),
nxt_string("undefined") },
{ nxt_string("var a = []; for (i in a) break;"),
nxt_string("undefined") },
{ nxt_string("var a = []; for (i in a) { break }"),
nxt_string("undefined") },
{ nxt_string("var a = [1,2,3,4,5]; var s = 0;"
"for (i in a) { if (a[i] > 4) break; else s += a[i] } s"),
nxt_string("10") },
{ nxt_string("var a = [1,2,3,4,5]; var s = 0;"
"for (i in a) { if (a[i] > 4) break; s += a[i] } s"),
nxt_string("10") },
{ nxt_string("var a = [1,2,3,4,5]; var s = 0;"
"for (i in a) if (a[i] > 4) break; s += a[i] } s"),
nxt_string("5") },
/**/
{ nxt_string("for (i = 0; i < 10; i++) { i += 1 } i"),
nxt_string("10") },
/* Factorial. */
{ nxt_string("n = 5; f = 1; while (n--) f *= n + 1; f"),
nxt_string("120") },
{ nxt_string("n = 5; f = 1; while (n) { f *= n; n-- } f"),
nxt_string("120") },
/* Fibonacci. */
{ nxt_string("var n = 50, x;"
"for(i=0,j=1,k=0; k<n; i=j,j=x,k++ ){ x=i+j } x"),
nxt_string("20365011074") },
{ nxt_string("3 + 'abc' + 'def' + null + true + false + undefined"),
nxt_string("3abcdefnulltruefalseundefined") },
{ nxt_string("a = 0; do a++; while (a < 5) if (a == 5) a = 7.33 \n"
"else a = 8; while (a < 10) a++; a"),
nxt_string("10.33") },
/* typeof. */
{ nxt_string("typeof null"),
nxt_string("object") },
{ nxt_string("typeof undefined"),
nxt_string("undefined") },
{ nxt_string("typeof false"),
nxt_string("boolean") },
{ nxt_string("typeof true"),
nxt_string("boolean") },
{ nxt_string("typeof 0"),
nxt_string("number") },
{ nxt_string("typeof -1"),
nxt_string("number") },
{ nxt_string("typeof Infinity"),
nxt_string("number") },
{ nxt_string("typeof NaN"),
nxt_string("number") },
{ nxt_string("typeof 'a'"),
nxt_string("string") },
{ nxt_string("typeof {}"),
nxt_string("object") },
{ nxt_string("typeof Object()"),
nxt_string("object") },
{ nxt_string("typeof []"),
nxt_string("object") },
{ nxt_string("typeof function(){}"),
nxt_string("function") },
{ nxt_string("typeof Object"),
nxt_string("function") },
{ nxt_string("typeof /./i"),
nxt_string("object") },
{ nxt_string("typeof a"),
nxt_string("undefined") },
{ nxt_string("typeof a; a"),
nxt_string("ReferenceError") },
{ nxt_string("typeof a; a = 1"),
nxt_string("1") },
/**/
{ nxt_string("void 0"),
nxt_string("undefined") },
{ nxt_string("null = 1"),
nxt_string("ReferenceError: Invalid left-hand side in assignment in 1") },
{ nxt_string("undefined = 1"),
nxt_string("ReferenceError: Invalid left-hand side in assignment in 1") },
{ nxt_string("null++"),
nxt_string("ReferenceError: Invalid left-hand side in postfix operation in 1") },
{ nxt_string("++null"),
nxt_string("ReferenceError: Invalid left-hand side in prefix operation in 1") },
{ nxt_string("var a; b = a; a = 1; a +' '+ b"),
nxt_string("1 undefined") },
{ nxt_string("a = 1"),
nxt_string("1") },
{ nxt_string("a; a = 1; a"),
nxt_string("ReferenceError") },
{ nxt_string("a = {}; typeof a +' '+ a"),
nxt_string("object [object Object]") },
{ nxt_string("a = {}; a.b"),
nxt_string("undefined") },
{ nxt_string("a = {}; a.b = 1 + 2; a.b"),
nxt_string("3") },
{ nxt_string("a = {}; a['b']"),
nxt_string("undefined") },
{ nxt_string("a = {}; a.b.c"),
nxt_string("TypeError") },
{ nxt_string("a = {}; a.b = 1; a.b"),
nxt_string("1") },
{ nxt_string("a = {}; a.b = 1; a.b += 2"),
nxt_string("3") },
{ nxt_string("a = {}; a.b = 1; a.b += a.b"),
nxt_string("2") },
{ nxt_string("a = {}; a.b = 1; x = {}; x.b = 3; a.b += (x.b = 2)"),
nxt_string("3") },
{ nxt_string("a = {}; a.b = 1; a.b += (a.b = 2)"),
nxt_string("3") },
{ nxt_string("a = {}; a.b += 1"),
nxt_string("NaN") },
{ nxt_string("a = 1; b = 2; a = b += 1"),
nxt_string("3") },
{ nxt_string("a = 1; b = { x:2 }; a = b.x += 1"),
nxt_string("3") },
{ nxt_string("a = 1; b = { x:2 }; a = b.x += (a = 1)"),
nxt_string("3") },
{ nxt_string("a = undefined; a.b++; a.b"),
nxt_string("TypeError") },
{ nxt_string("a = null; a.b++; a.b"),
nxt_string("TypeError") },
{ nxt_string("a = true; a.b++; a.b"),
nxt_string("undefined") },
{ nxt_string("a = 1; a.b++; a.b"),
nxt_string("undefined") },
{ nxt_string("a = {}; a.b = {}; a.b.c = 1; a.b['c']"),
nxt_string("1") },
{ nxt_string("a = {}; a.b = {}; a.b.c = 1; a['b']['c']"),
nxt_string("1") },
{ nxt_string("a = {}; a.b = {}; c = 'd'; a.b.d = 1; a['b'][c]"),
nxt_string("1") },
{ nxt_string("a = {}; a.b = 1; c = a.b++; a.b +' '+ c"),
nxt_string("2 1") },
{ nxt_string("a = 2; a.b = 1; c = a.b++; a +' '+ a.b +' '+ c"),
nxt_string("2 undefined NaN") },
{ nxt_string("x = { a: 1 }; x.a"),
nxt_string("1") },
{ nxt_string("a = { x:1 }; b = { y:2 }; a.x = b.y; a.x"),
nxt_string("2") },
{ nxt_string("a = { x:1 }; b = { y:2 }; c = a.x = b.y; c"),
nxt_string("2") },
{ nxt_string("a = { x:1 }; b = { y:2 }; a.x = b.y"),
nxt_string("2") },
{ nxt_string("a = { x:1 }; b = a.x = 1 + 2; a.x +' '+ b"),
nxt_string("3 3") },
{ nxt_string("a = { x:1 }; b = { y:2 }; c = {}; c.x = a.x = b.y; c.x"),
nxt_string("2") },
{ nxt_string("y = 2; x = { a:1, b: y + 5, c:3 }; x.a +' '+ x.b +' '+ x.c"),
nxt_string("1 7 3") },
{ nxt_string("x = { a: 1, b: { a:2, c:5 } }; x.a +' '+ x.b.a +' '+ x.b.c"),
nxt_string("1 2 5") },
{ nxt_string("var y = 5; x = { a:y }; x.a"),
nxt_string("5") },
{ nxt_string("x = { a: 1; b: 2 }"),
nxt_string("SyntaxError: Unexpected token \";\" in 1") },
{ nxt_string("x = { a: 1, b: x.a }"),
nxt_string("ReferenceError") },
{ nxt_string("a = { b: 2 }; a.b += 1"),
nxt_string("3") },
{ nxt_string("o = {a:1}; c = o; o.a = o = {b:5};"
"o.a +' '+ o.b +' '+ c.a.b"),
nxt_string("undefined 5 5") },
{ nxt_string("y = { a: 2 }; x = { a: 1, b: y.a }; x.a +' '+ x.b"),
nxt_string("1 2") },
{ nxt_string("y = { a: 1 }; x = { a: y.a++, b: y.a++ }\n"
"x.a +' '+ x.b +' '+ y.a"),
nxt_string("1 2 3") },
{ nxt_string("var a=''; var o = {a:1, b:2}"
"for (p in o) { a += p +':'+ o[p] +',' } a"),
nxt_string("a:1,b:2,") },
{ nxt_string("x = { a: 1 }; b = delete x.a; x.a +' '+ b"),
nxt_string("undefined true") },
{ nxt_string("delete null"),
nxt_string("true") },
{ nxt_string("var a; delete a"),
nxt_string("false") },
{ nxt_string("delete undefined"),
nxt_string("false") },
{ nxt_string("delete NaN"),
nxt_string("false") },
{ nxt_string("delete Infinity"),
nxt_string("false") },
{ nxt_string("delete -Infinity"),
nxt_string("true") },
{ nxt_string("delete (1/0)"),
nxt_string("true") },
{ nxt_string("delete 1"),
nxt_string("true") },
{ nxt_string("delete (a = 1); a"),
nxt_string("1") },
{ nxt_string("delete a"),
nxt_string("true") },
{ nxt_string("a = 1; delete a"),
nxt_string("true") },
{ nxt_string("a = 1; delete a; typeof a"),
nxt_string("undefined") },
{ nxt_string("a = { x:1 }; ('x' in a) +' '+ (1 in a)"),
nxt_string("true false") },
{ nxt_string("a = {}; 1 in a"),
nxt_string("false") },
{ nxt_string("a = 1; 1 in a"),
nxt_string("TypeError") },
{ nxt_string("a = true; 1 in a"),
nxt_string("TypeError") },
{ nxt_string("var n = { toString: function() { return 'a' } };"
"var o = { a: 5 }; o[n]"),
nxt_string("5") },
{ nxt_string("var n = { valueOf: function() { return 'a' } };"
"var o = { a: 5, '[object Object]': 7 }; o[n]"),
nxt_string("7") },
{ nxt_string("var o = {}; o.new = 'OK'; o.new"),
nxt_string("OK") },
{ nxt_string("var o = { new: 'OK'}; o.new"),
nxt_string("OK") },
/* Arrays */
/* Empty array to primitive. */
{ nxt_string("3 + []"),
nxt_string("3") },
{ nxt_string("3 * []"),
nxt_string("0") },
/* Single element array to primitive. */
{ nxt_string("3 + [5]"),
nxt_string("35") },
{ nxt_string("3 * [5]"),
nxt_string("15") },
/* Array to primitive. */
{ nxt_string("3 + [5,7]"),
nxt_string("35,7") },
{ nxt_string("3 * [5,7]"),
nxt_string("NaN") },
{ nxt_string("a = [ 1, 2, 3 ]; a[0] + a[1] + a[2]"),
nxt_string("6") },
{ nxt_string("a = [ 1, 2; 3 ]; a[0] + a[1] + a[2]"),
nxt_string("SyntaxError: Unexpected token \";\" in 1") },
{ nxt_string("a = [ 1, 2, 3 ]; a[0] +' '+ a[1] +' '+ a[2] +' '+ a[3]"),
nxt_string("1 2 3 undefined") },
{ nxt_string("[] - 2"),
nxt_string("-2") },
{ nxt_string("[1] - 2"),
nxt_string("-1") },
{ nxt_string("[[1]] - 2"),
nxt_string("-1") },
{ nxt_string("[[[1]]] - 2"),
nxt_string("-1") },
{ nxt_string("a = []; a - 2"),
nxt_string("-2") },
{ nxt_string("a = [1]; a - 2"),
nxt_string("-1") },
{ nxt_string("a = []; a[0] = 1; a - 2"),
nxt_string("-1") },
{ nxt_string("[] + 2 + 3"),
nxt_string("23") },
{ nxt_string("[1] + 2 + 3"),
nxt_string("123") },
{ nxt_string("a = []; a + 2 + 3"),
nxt_string("23") },
{ nxt_string("a = [1]; a + 2 + 3"),
nxt_string("123") },
{ nxt_string("a = [1,2]; i = 0; a[i++] += a[0] = 5 + i; a[0] +' '+ a[1]"),
nxt_string("7 2") },
{ nxt_string("a = []; a[0] = 1; a + 2 + 3"),
nxt_string("123") },
{ nxt_string("a = []; a['0'] = 1; a + 2 + 3"),
nxt_string("123") },
{ nxt_string("a = []; a[2] = 1; a[2]"),
nxt_string("1") },
{ nxt_string("a = [1, 2]; 1 in a"),
nxt_string("true") },
{ nxt_string("a = [1, 2]; 2 in a"),
nxt_string("false") },
{ nxt_string("a = [1, 2]; delete a[0]; 0 in a"),
nxt_string("false") },
{ nxt_string("var s = '', a = [5,1,2];"
"a[null] = null;"
"a[undefined] = 'defined';"
"a[false] = false;"
"a[true] = true;"
"a[-0] = 0;"
"a[Infinity] = Infinity;"
"a[-Infinity] = -Infinity;"
"a[NaN] = NaN;"
"a[-NaN] = -NaN;"
"for (i in a) { s += i +':'+ a[i] +',' } s"),
nxt_string("0:0,1:1,2:2,null:null,undefined:defined,false:false,"
"true:true,Infinity:Infinity,-Infinity:-Infinity,NaN:NaN,") },
{ nxt_string("[].length"),
nxt_string("0") },
{ nxt_string("[1,2].length"),
nxt_string("2") },
{ nxt_string("a = [1,2]; a.length"),
nxt_string("2") },
{ nxt_string("a = [1,2,3]; a.join()"),
nxt_string("1,2,3") },
{ nxt_string("a = [1,2,3]; a.join(':')"),
nxt_string("1:2:3") },
{ nxt_string("a = []; a[5] = 5; a.join()"),
nxt_string(",,,,,5") },
{ nxt_string("a = []; a[5] = 5; a"),
nxt_string(",,,,,5") },
{ nxt_string("a = []; a.concat([])"),
nxt_string("") },
{ nxt_string("var s = { toString: function() { return 'S' } }"
"var v = { toString: 8, valueOf: function() { return 'V' } }"
"var o = [9]; o.join = function() { return 'O' };"
"var a = [1,2,3,[4,5,6],s,v,o]; a.join('')"),
nxt_string("1234,5,6SVO") },
{ nxt_string("var s = { toString: function() { return 'S' } }"
"var v = { toString: 8, valueOf: function() { return 'V' } }"
"var o = [9]; o.join = function() { return 'O' };"
"var a = [1,2,3,[4,5,6],s,v,o]; a"),
nxt_string("1,2,3,4,5,6,S,V,O") },
/* Array.toString(). */
{ nxt_string("a = [1,2,3]; a.join = 'NO';"
"Object.prototype.toString = function () { return 'A' }; a"),
nxt_string("[object Array]") },
{ nxt_string("Array.prototype.toString.call(1)"),
nxt_string("[object Number]") },
{ nxt_string("Array.prototype.toString.call('abc')"),
nxt_string("[object String]") },
/* Empty array elements. */
{ nxt_string("[,,]"),
nxt_string(",") },
{ nxt_string("[,,,]"),
nxt_string(",,") },
{ nxt_string("[1,2,]"),
nxt_string("1,2") },
{ nxt_string("[1,2,,3]"),
nxt_string("1,2,,3") },
{ nxt_string("[,,].length"),
nxt_string("2") },
{ nxt_string("[,,,].length"),
nxt_string("3") },
{ nxt_string("[1,2,,3].length"),
nxt_string("4") },
/**/
{ nxt_string("var n = { toString: function() { return 1 } }; [1,2][n]"),
nxt_string("2") },
{ nxt_string("var n = { toString: function() { return '1' } }; [1,2][n]"),
nxt_string("2") },
{ nxt_string("var n = { toString: function() { return 1 },"
" valueOf: function() { return 0 } }; [1,2][n]"),
nxt_string("2") },
{ nxt_string("var n = { toString: function() { return 1.5 } };"
"var a = [1,2]; a[1.5] = 5; a[n]"),
nxt_string("5") },
{ nxt_string("var n = { toString: function() { return 1.5 } };"
"var a = [1,2]; a[n] = 5; a[1.5]"),
nxt_string("5") },
{ nxt_string("var n = { toString: function() { return '1.5' } };"
"var a = [1,2]; a[1.5] = 5; a[n]"),
nxt_string("5") },
{ nxt_string("var n = { toString: function() { return '1.5' } };"
"var a = [1,2]; a[n] = 5; a[1.5]"),
nxt_string("5") },
{ nxt_string("var n = { toString: function() { return 1.5 } };"
"var a = [1,2]; a[1.5] = 5; n in a"),
nxt_string("true") },
{ nxt_string("var n = { toString: function() { return '1.5' } };"
"var a = [1,2]; a[1.5] = 5; '' + (n in a) + (delete a[n])"),
nxt_string("truetrue") },
/**/
{ nxt_string("a = [1,2,3]; a.concat(4, [5, 6, 7], 8)"),
nxt_string("1,2,3,4,5,6,7,8") },
{ nxt_string("a = []; a[100] = a.length; a[100] +' '+ a.length"),
nxt_string("0 101") },
{ nxt_string("a = [1,2]; a[100] = 100; a[100] +' '+ a.length"),
nxt_string("100 101") },
{ nxt_string("a = [1,2,3,4,5]; b = a.slice(3); b[0] +' '+ b[1] +' '+ b[2]"),
nxt_string("4 5 undefined") },
{ nxt_string("a = [1,2]; a.pop() +' '+ a.length +' '+ a"),
nxt_string("2 1 1") },
{ nxt_string("a = [1,2]; len = a.push(3); len +' '+ a.pop() +' '+ a"),
nxt_string("3 3 1,2") },
{ nxt_string("a = [1,2]; len = a.push(3,4,5); len +' '+ a.pop() +' '+ a"),
nxt_string("5 5 1,2,3,4") },
{ nxt_string("a = [1,2,3]; a.shift() +' '+ a[0] +' '+ a.length"),
nxt_string("1 2 2") },
{ nxt_string("a = [1,2]; len = a.unshift(3);"
"len +' '+ a +' '+ a.shift()"),
nxt_string("3 3,1,2 3") },
{ nxt_string("a = [1,2]; len = a.unshift(3,4,5);"
"len +' '+ a +' '+ a.shift()"),
nxt_string("5 3,4,5,1,2 3") },
{ nxt_string("var a = []; a.reverse()"),
nxt_string("") },
{ nxt_string("var a = [1]; a.reverse()"),
nxt_string("1") },
{ nxt_string("var a = [1,2]; a.reverse()"),
nxt_string("2,1") },
{ nxt_string("var a = [1,2,3]; a.reverse()"),
nxt_string("3,2,1") },
{ nxt_string("var a = [1,2,3,4]; a.reverse()"),
nxt_string("4,3,2,1") },
{ nxt_string("var a = []; var s = { sum: 0 };"
"a.forEach(function(v, i, a) { this.sum += v }, s); s.sum"),
nxt_string("0") },
{ nxt_string("var a = new Array(3); var s = { sum: 0 };"
"a.forEach(function(v, i, a) { this.sum += v }, s); s.sum"),
nxt_string("0") },
{ nxt_string("var a = [,,,]; var s = { sum: 0 };"
"a.forEach(function(v, i, a) { this.sum += v }, s); s.sum"),
nxt_string("0") },
{ nxt_string("var a = [1,2,3]; var s = { sum: 0 };"
"a.forEach(function(v, i, a) { this.sum += v }, s); s.sum"),
nxt_string("6") },
{ nxt_string("var a = [1,2,3];"
"a.forEach(function(v, i, a) { a[i+3] = a.length }); a"),
nxt_string("1,2,3,3,4,5") },
{ nxt_string("var a = [1,2,3]; var s = { sum: 0 };"
"[].forEach.call(a, function(v, i, a) { this.sum += v }, s);"
"s.sum"),
nxt_string("6") },
{ nxt_string("var a = [1,2,3]; var s = { sum: 0 };"
"[].forEach.apply(a,"
"[ function(v, i, a) { this.sum += v }, s ]);"
"s.sum"),
nxt_string("6") },
{ nxt_string("var a = [];"
"a.some(function(v, i, a) { return v > 1 })"),
nxt_string("false") },
{ nxt_string("var a = [1,2,3];"
"a.some(function(v, i, a) { return v > 1 })"),
nxt_string("true") },
{ nxt_string("var a = [1,2,3];"
"a.some(function(v, i, a) { return v > 2 })"),
nxt_string("true") },
{ nxt_string("var a = [1,2,3];"
"a.some(function(v, i, a) { return v > 3 })"),
nxt_string("false") },
{ nxt_string("var a = [];"
"a.every(function(v, i, a) { return v > 1 })"),
nxt_string("true") },
{ nxt_string("var a = [3,2,1];"
"a.every(function(v, i, a) { return v > 3 })"),
nxt_string("false") },
{ nxt_string("var a = [3,2,1];"
"a.every(function(v, i, a) { return v > 2 })"),
nxt_string("false") },
{ nxt_string("var a = [3,2,1];"
"a.every(function(v, i, a) { return v > 0 })"),
nxt_string("true") },
/* Strings. */
{ nxt_string("var a = '0123456789' + '012345'"
"var b = 'abcdefghij' + 'klmnop'"
" a = b"),
nxt_string("abcdefghijklmnop") },
/* Escape strings. */
{ nxt_string("'\\a \\' \\\" \\\\ \\0 \\b \\f \\n \\r \\t \\v'"),
nxt_string("a ' \" \\ \0 \b \f \n \r \t \v") },
{ nxt_string("'a\\\nb'"),
nxt_string("ab") },
{ nxt_string("'a\\\rb'"),
nxt_string("ab") },
{ nxt_string("'a\\\r\nb'"),
nxt_string("ab") },
{ nxt_string("'abcde"),
nxt_string("SyntaxError: Unterminated string \"'abcde\" in 1") },
{ nxt_string("'\\"),
nxt_string("SyntaxError: Unterminated string \"'\\\" in 1") },
{ nxt_string("'\\'"),
nxt_string("SyntaxError: Unterminated string \"'\\'\" in 1") },
{ nxt_string("'\\u03B1'"),
nxt_string("α") },
{ nxt_string("'\\u'"),
nxt_string("SyntaxError: Invalid Unicode code point \"\\u\" in 1") },
{ nxt_string("'\\u03B'"),
nxt_string("SyntaxError: Invalid Unicode code point \"\\u03B\" in 1") },
{ nxt_string("'\\u{61}\\u{3B1}\\u{20AC}'"),
nxt_string("aα€") },
{ nxt_string("'\\u'"),
nxt_string("SyntaxError: Invalid Unicode code point \"\\u\" in 1") },
{ nxt_string("'\\u{'"),
nxt_string("SyntaxError: Invalid Unicode code point \"\\u{\" in 1") },
{ nxt_string("'\\u{}'"),
nxt_string("SyntaxError: Invalid Unicode code point \"\\u{}\" in 1") },
{ nxt_string("'\\u{1234567}'"),
nxt_string("SyntaxError: Invalid Unicode code point \"\\u{1234567}\" in 1") },
{ nxt_string("'\\x61'"),
nxt_string("a") },
{ nxt_string("''.length"),
nxt_string("0") },
{ nxt_string("'abc'.length"),
nxt_string("3") },
{ nxt_string("'abc'.toUTF8().length"),
nxt_string("3") },
{ nxt_string("'абв'.length"),
nxt_string("3") },
{ nxt_string("'абв'.toUTF8().length"),
nxt_string("6") },
{ nxt_string("'αβγ'.length"),
nxt_string("3") },
{ nxt_string("'αβγ'.toUTF8().length"),
nxt_string("6") },
{ nxt_string("'絵文字'.length"),
nxt_string("3") },
{ nxt_string("'絵文字'.toUTF8().length"),
nxt_string("9") },
{ nxt_string("'えもじ'.length"),
nxt_string("3") },
{ nxt_string("'えもじ'.toUTF8().length"),
nxt_string("9") },
{ nxt_string("'囲碁織'.length"),
nxt_string("3") },
{ nxt_string("'囲碁織'.toUTF8().length"),
nxt_string("9") },
{ nxt_string("a = 'abc'; a.length"),
nxt_string("3") },
{ nxt_string("a = 'abc'; a['length']"),
nxt_string("3") },
{ nxt_string("a = 'абв'; a.length"),
nxt_string("3") },
{ nxt_string("a = 'abc' + 'абв'; a.length"),
nxt_string("6") },
{ nxt_string("a = 'abc' + 1 + 'абв'; a +' '+ a.length"),
nxt_string("abc1абв 7") },
{ nxt_string("a = 1; a.length"),
nxt_string("undefined") },
{ nxt_string("a = 'abc'; a.concat('абв', 123)"),
nxt_string("abcабв123") },
{ nxt_string("''.concat.call(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)"),
nxt_string("0123456789") },
{ nxt_string("''.concat.apply(0, [1, 2, 3, 4, 5, 6, 7, 8, 9])"),
nxt_string("0123456789") },
{ nxt_string("var f = ''.concat.bind(0, 1, 2, 3, 4); f(5, 6, 7, 8, 9)"),
nxt_string("0123456789") },
{ nxt_string("var f = String.prototype.concat.bind(0, 1); f(2)"),
nxt_string("012") },
{ nxt_string("var f = Function.prototype.call.bind"
" (String.prototype.concat, 0, 1);"
"f(2)"),
nxt_string("012") },
{ nxt_string("var f = String.prototype.concat.bind(0, 1);"
"var o = { toString: f }; o"),
nxt_string("01") },
{ nxt_string("''.concat.bind(0, 1, 2, 3, 4).call(5, 6, 7, 8, 9)"),
nxt_string("012346789") },
{ nxt_string("''.concat.bind(0, 1, 2, 3, 4).apply(5,[6, 7, 8, 9])"),
nxt_string("012346789") },
{ nxt_string("var f = Array.prototype.join.bind([0, 1, 2]); f()"),
nxt_string("0,1,2") },
{ nxt_string("var f = Array.prototype.join.bind([0, 1, 2]);"
"var o = { toString: f }; o"),
nxt_string("0,1,2") },
{ nxt_string("var f = Array.prototype.join.bind([0, 1, 2]); f('.')"),
nxt_string("0.1.2") },
{ nxt_string("var f = Array.prototype.join.bind([0, 1, 2], '.');"
"var o = { toString: f }; o"),
nxt_string("0.1.2") },
{ nxt_string("var f = Array.prototype.toString.bind([0, 1, 2]); f()"),
nxt_string("0,1,2") },
{ nxt_string("var f = Array.prototype.toString.bind([0, 1, 2]);"
"var o = { toString: f }; o"),
nxt_string("0,1,2") },
{ nxt_string("var s = { toString: function() { return '123' } };"
"var a = 'abc'; a.concat('абв', s)"),
nxt_string("abcабв123") },
{ nxt_string("'\\u00CE\\u00B1'.toBytes() == 'α'"),
nxt_string("true") },
{ nxt_string("'\\u00CE\\u00B1'.toBytes() === 'α'"),
nxt_string("false") },
{ nxt_string("b = '\\u00C2\\u00B6'.toBytes(); u = b.fromUTF8();"
"b.length +' '+ b +' '+ u.length +' '+ u"),
nxt_string("2 ¶ 1 ¶") },
{ nxt_string("'α'.toBytes()"),
nxt_string("null") },
{ nxt_string("'α'.toUTF8()[0]"),
nxt_string("\xCE") },
{ nxt_string("a = 'a'.toBytes() + 'α'; a + a.length"),
nxt_string("aα3") },
{ nxt_string("a = 'µ§±®'.toBytes(); a"),
nxt_string("\xB5\xA7\xB1\xAE") },
{ nxt_string("a = 'µ§±®'.toBytes(2); a"),
nxt_string("\xB1\xAE") },
{ nxt_string("a = 'µ§±®'.toBytes(1,3); a"),
nxt_string("\xA7\xB1") },
{ nxt_string("a = '\\xB5\\xA7\\xB1\\xAE'.toBytes(); a.fromBytes()"),
nxt_string("µ§±®") },
{ nxt_string("a = '\\xB5\\xA7\\xB1\\xAE'.toBytes(); a.fromBytes(2)"),
nxt_string("±®") },
{ nxt_string("a = '\\xB5\\xA7\\xB1\\xAE'.toBytes(); a.fromBytes(1, 3)"),
nxt_string("§±") },
{ nxt_string("a = 'abcdefgh'; a.substr(3, 15)"),
nxt_string("defgh") },
{ nxt_string("'abcdefgh'.substr(3, 15)"),
nxt_string("defgh") },
{ nxt_string("'abcdefghijklmno'.substr(3, 4)"),
nxt_string("defg") },
{ nxt_string("'abcdefghijklmno'.substr(-3, 2)"),
nxt_string("mn") },
{ nxt_string("'abcdefgh'.substr(100, 120)"),
nxt_string("") },
{ nxt_string("('abc' + 'defgh').substr(1, 4)"),
nxt_string("bcde") },
{ nxt_string("'abcdefghijklmno'.substring(3, 5)"),
nxt_string("de") },
{ nxt_string("'abcdefgh'.substring(3)"),
nxt_string("defgh") },
{ nxt_string("'abcdefgh'.substring(5, 3)"),
nxt_string("de") },
{ nxt_string("'abcdefgh'.substring(100, 120)"),
nxt_string("") },
{ nxt_string("'abcdefghijklmno'.slice(NaN, 5)"),
nxt_string("abcde") },
{ nxt_string("'abcdefghijklmno'.slice(NaN, Infinity)"),
nxt_string("abcdefghijklmno") },
{ nxt_string("'abcdefghijklmno'.slice(-Infinity, Infinity)"),
nxt_string("abcdefghijklmno") },
{ nxt_string("'abcdefghijklmno'.slice('0', '5')"),
nxt_string("abcde") },
{ nxt_string("'abcdefghijklmno'.slice(3, 5)"),
nxt_string("de") },
{ nxt_string("'abcdefgh'.slice(3)"),
nxt_string("defgh") },
{ nxt_string("'abcdefgh'.slice(3, -2)"),
nxt_string("def") },
{ nxt_string("'abcdefgh'.slice(5, 3)"),
nxt_string("") },
{ nxt_string("'abcdefgh'.slice(100, 120)"),
nxt_string("") },
{ nxt_string("'abc'.charAt(1 + 1)"),
nxt_string("c") },
{ nxt_string("'abc'.charAt(3)"),
nxt_string("") },
{ nxt_string("'abc'.charAt(undefined)"),
nxt_string("a") },
{ nxt_string("'abc'.charAt(null)"),
nxt_string("a") },
{ nxt_string("'abc'.charAt(false)"),
nxt_string("a") },
{ nxt_string("'abc'.charAt(true)"),
nxt_string("b") },
{ nxt_string("'abc'.charAt(NaN)"),
nxt_string("a") },
{ nxt_string("'abc'.charAt(Infinity)"),
nxt_string("") },
{ nxt_string("'abc'.charAt(-Infinity)"),
nxt_string("") },
{ nxt_string("var o = { valueOf: function() {return 2} }"
"'abc'.charAt(o)"),
nxt_string("c") },
{ nxt_string("var o = { toString: function() {return '2'} }"
"'abc'.charAt(o)"),
nxt_string("c") },
{ nxt_string("'abc'.charCodeAt(1 + 1)"),
nxt_string("99") },
{ nxt_string("'abc'.charCodeAt(3)"),
nxt_string("NaN") },
{ nxt_string("a = 'abcdef'; a.3"),
nxt_string("SyntaxError: Unexpected token \"3\" in 1") },
{ nxt_string("'abcdef'[3]"),
nxt_string("d") },
{ nxt_string("'abcdef'[0]"),
nxt_string("a") },
{ nxt_string("'abcdef'[-1]"),
nxt_string("undefined") },
{ nxt_string("'abcdef'[NaN]"),
nxt_string("undefined") },
{ nxt_string("'abcdef'[3.5]"),
nxt_string("undefined") },
{ nxt_string("'abcdef'[8]"),
nxt_string("undefined") },
{ nxt_string("a = 'abcdef'; b = 1 + 2; a[b]"),
nxt_string("d") },
/**/
{ nxt_string("'abc'.toString()"),
nxt_string("abc") },
{ nxt_string("''.toString.call('abc')"),
nxt_string("abc") },
{ nxt_string("String.prototype.toString.call('abc')"),
nxt_string("abc") },
{ nxt_string("String.prototype.toString.call(new String('abc'))"),
nxt_string("abc") },
{ nxt_string("String.prototype.toString.call(1)"),
nxt_string("TypeError") },
{ nxt_string("'abc'.valueOf()"),
nxt_string("abc") },
/**/
{ nxt_string("var n = { toString: function() { return 1 } }; '12'[n]"),
nxt_string("2") },
{ nxt_string("var n = { toString: function() { return '1' } }; '12'[n]"),
nxt_string("2") },
{ nxt_string("var n = { toString: function() { return 1 },"
" valueOf: function() { return 0 } }; '12'[n]"),
nxt_string("2") },
/* Externals. */
{ nxt_string("typeof $r"),
nxt_string("undefined") },
{ nxt_string("a = $r.uri; s = a.fromUTF8(); s.length +' '+ s"),
nxt_string("3 АБВ") },
{ nxt_string("a = $r.uri; s = a.fromUTF8(2); s.length +' '+ s"),
nxt_string("2 БВ") },
{ nxt_string("a = $r.uri; s = a.fromUTF8(2, 4); s.length +' '+ s"),
nxt_string("1 Б") },
{ nxt_string("a = $r.uri; a +' '+ a.length +' '+ a"),
nxt_string("АБВ 6 АБВ") },
{ nxt_string("$r.uri = 'αβγ'; a = $r.uri; a.length +' '+ a"),
nxt_string("6 αβγ") },
{ nxt_string("$r.uri.length +' '+ $r.uri"),
nxt_string("6 АБВ") },
{ nxt_string("$r.uri = $r.uri.substr(2); $r.uri.length +' '+ $r.uri"),
nxt_string("4 БВ") },
{ nxt_string("a = $r.host; a +' '+ a.length +' '+ a"),
nxt_string("АБВГДЕЁЖЗИЙ 22 АБВГДЕЁЖЗИЙ") },
{ nxt_string("a = $r.host; a.substr(2, 2)"),
nxt_string("Б") },
{ nxt_string("a = $r.header['User-Agent']; a +' '+ a.length +' '+ a"),
nxt_string("User-Agent|АБВ 17 User-Agent|АБВ") },
{ nxt_string("var a='';"
"for (p in $r.header) { a += p +':'+ $r.header[p] +',' }"
"a"),
nxt_string("01:01|АБВ,02:02|АБВ,03:03|АБВ,") },
{ nxt_string("$r.some_method('YES')"),
nxt_string("АБВ") },
{ nxt_string("for (p in $r.some_method);"),
nxt_string("undefined") },
{ nxt_string("'uri' in $r"),
nxt_string("true") },
{ nxt_string("'one' in $r"),
nxt_string("false") },
{ nxt_string("delete $r.uri"),
nxt_string("false") },
{ nxt_string("delete $r.one"),
nxt_string("false") },
#if 0
{ nxt_string("$r.some_method.call($r, 'YES')"),
nxt_string("АБВ") },
{ nxt_string("$r.some_method.apply($r, ['YES'])"),
nxt_string("АБВ") },
#endif
{ nxt_string("$r.nonexistent"),
nxt_string("undefined") },
{ nxt_string("$r.error = 'OK'"),
nxt_string("OK") },
{ nxt_string("var a = { toString: function() { return 1 } }; a"),
nxt_string("1") },
{ nxt_string("var a = { valueOf: function() { return 1 } }; a"),
nxt_string("[object Object]") },
{ nxt_string("var a = { toString: 2,"
" valueOf: function() { return 1 } }; a"),
nxt_string("1") },
{ nxt_string("var a = { toString: function() { return [] },"
" valueOf: function() { return 1 } }; a"),
nxt_string("1") },
/**/
{ nxt_string("'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.charCodeAt(5)"),
nxt_string("1077") },
{ nxt_string("'12345абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.charCodeAt(35)"),
nxt_string("1101") },
{ nxt_string("'12345абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.substring(35)"),
nxt_string("эюя") },
{ nxt_string("'abcdef'.substr(-5, 4).substring(3, 1).charAt(1)"),
nxt_string("d") },
{ nxt_string("'abcdef'.substr(2, 4).charAt(2)"),
nxt_string("e") },
{ nxt_string("a = 'abcdef'.substr(2, 4).charAt(2).length"),
nxt_string("1") },
{ nxt_string("a = 'abcdef'.substr(2, 4).charAt(2) + '1234'"),
nxt_string("e1234") },
{ nxt_string("a = ('abcdef'.substr(2, 5 * 2 - 6).charAt(2) + '1234')"
" .length"),
nxt_string("5") },
{ nxt_string("String.fromCharCode('_')"),
nxt_string("RangeError") },
{ nxt_string("String.fromCharCode(3.14)"),
nxt_string("RangeError") },
{ nxt_string("String.fromCharCode(65, 90)"),
nxt_string("AZ") },
{ nxt_string("String.fromCharCode(945, 946, 947)"),
nxt_string("αβγ") },
{ nxt_string("(function() {"
" for (n = 0; n <= 1114111; n++) {"
" if (String.fromCharCode(n).charCodeAt(0) !== n)"
" return n;"
" }"
" return -1"
"})()"),
nxt_string("-1") },
{ nxt_string("a = 'abcdef'; function f(a) {"
"return a.slice(a.indexOf('cd')) } f(a)"),
nxt_string("cdef") },
{ nxt_string("a = 'abcdef'; a.slice(a.indexOf('cd'))"),
nxt_string("cdef") },
{ nxt_string("'abcdef'.indexOf('de', 2)"),
nxt_string("3") },
{ nxt_string("'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.indexOf('лмно', 10)"),
nxt_string("12") },
{ nxt_string("'abcdef'.indexOf('a', 10)"),
nxt_string("-1") },
{ nxt_string("'abcdef'.indexOf('q', 0)"),
nxt_string("-1") },
{ nxt_string("'abcdef'.indexOf('', 10)"),
nxt_string("6") },
{ nxt_string("'abcdef'.indexOf('', 3)"),
nxt_string("3") },
{ nxt_string("'12345'.indexOf()"),
nxt_string("-1") },
{ nxt_string("'12345'.indexOf(45, '0')"),
nxt_string("3") },
{ nxt_string("''.indexOf.call(12345, 45, '0')"),
nxt_string("3") },
{ nxt_string("'abc abc abc abc'.lastIndexOf('abc')"),
nxt_string("12") },
{ nxt_string("'abc abc abc abc'.lastIndexOf('abc', 11)"),
nxt_string("8") },
{ nxt_string("'abc abc abc abc'.lastIndexOf('abc', 0)"),
nxt_string("-1") },
{ nxt_string("'ABC'.toLowerCase()"),
nxt_string("abc") },
{ nxt_string("'ΑΒΓ'.toLowerCase()"),
nxt_string("αβγ") },
{ nxt_string("'АБВ'.toLowerCase()"),
nxt_string("абв") },
{ nxt_string("'abc'.toUpperCase()"),
nxt_string("ABC") },
{ nxt_string("'αβγ'.toUpperCase()"),
nxt_string("ΑΒΓ") },
{ nxt_string("'абв'.toUpperCase()"),
nxt_string("АБВ") },
{ nxt_string("var a = [];"
"for (code = 0; code <= 1114111; code++) {"
" var s = String.fromCharCode(code);"
" var n = s.toUpperCase();"
" if (s != n && s != n.toLowerCase())"
" a.push(code);"
"} a"),
nxt_string("181,305,383,453,456,459,498,837,962,976,977,981,982,1008,1009,1013,7835,8126") },
{ nxt_string("var a = [];"
"for (code = 0; code <= 1114111; code++) {"
" var s = String.fromCharCode(code);"
" var n = s.toLowerCase();"
" if (s != n && s != n.toUpperCase())"
" a.push(code);"
"} a"),
nxt_string("304,453,456,459,498,1012,7838,8486,8490,8491") },
{ nxt_string("'abcdefgh'.search()"),
nxt_string("0") },
{ nxt_string("'abcdefgh'.search('')"),
nxt_string("0") },
{ nxt_string("'abcdefgh'.search(undefined)"),
nxt_string("0") },
{ nxt_string("'abcdefgh'.search(/def/)"),
nxt_string("3") },
{ nxt_string("'abcdefgh'.search('def')"),
nxt_string("3") },
{ nxt_string("'123456'.search('45')"),
nxt_string("3") },
{ nxt_string("'123456'.search(45)"),
nxt_string("3") },
{ nxt_string("'123456'.search(String(45))"),
nxt_string("3") },
{ nxt_string("'123456'.search(Number('45'))"),
nxt_string("3") },
{ nxt_string("var r = { toString: function() { return '45' } }"
"'123456'.search(r)"),
nxt_string("3") },
{ nxt_string("var r = { toString: function() { return 45 } }"
"'123456'.search(r)"),
nxt_string("3") },
{ nxt_string("var r = { toString: function() { return /45/ } }"
"'123456'.search(r)"),
nxt_string("TypeError") },
{ nxt_string("var r = { toString: function() { return /34/ },"
" valueOf: function() { return 45 } }"
"'123456'.search(r)"),
nxt_string("3") },
{ nxt_string("'abcdefgh'.match()"),
nxt_string("") },
{ nxt_string("'abcdefgh'.match('')"),
nxt_string("") },
{ nxt_string("'abcdefgh'.match(undefined)"),
nxt_string("") },
{ nxt_string("'abcdefgh'.match(/def/)"),
nxt_string("def") },
{ nxt_string("'abcdefgh'.match('def')"),
nxt_string("def") },
{ nxt_string("'123456'.match('45')"),
nxt_string("45") },
{ nxt_string("'123456'.match(45)"),
nxt_string("45") },
{ nxt_string("'123456'.match(String(45))"),
nxt_string("45") },
{ nxt_string("'123456'.match(Number('45'))"),
nxt_string("45") },