istanbul-tools/vendor/github.com/robertkrimen/otto/json_test.go

184 lines
4.3 KiB
Go

package otto
import (
"testing"
)
func BenchmarkJSON_parse(b *testing.B) {
vm := New()
for i := 0; i < b.N; i++ {
vm.Run(`JSON.parse("1")`)
vm.Run(`JSON.parse("[1,2,3]")`)
vm.Run(`JSON.parse('{"a":{"x":100,"y":110},"b":[10,20,30],"c":"zazazaza"}')`)
vm.Run(`JSON.parse("[1,2,3]", function(k, v) { return undefined })`)
}
}
func TestJSON_parse(t *testing.T) {
tt(t, func() {
test, _ := test()
test(`
JSON.parse("1");
`, 1)
test(`
JSON.parse("null");
`, "null") // TODO Can we make this nil?
test(`
var abc = JSON.parse('"a\uFFFFbc"');
[ abc[0], abc[2], abc[3], abc.length ];
`, "a,b,c,4")
test(`
JSON.parse("[1, 2, 3]");
`, "1,2,3")
test(`
JSON.parse('{ "abc": 1, "def":2 }').abc;
`, 1)
test(`
JSON.parse('{ "abc": { "x": 100, "y": 110 }, "def": [ 10, 20 ,30 ], "ghi": "zazazaza" }').def;
`, "10,20,30")
test(`raise:
JSON.parse("12\t\r\n 34");
`, "SyntaxError: invalid character '3' after top-level value")
test(`
JSON.parse("[1, 2, 3]", function() { return undefined });
`, "undefined")
test(`raise:
JSON.parse("");
`, "SyntaxError: unexpected end of JSON input")
test(`raise:
JSON.parse("[1, 2, 3");
`, "SyntaxError: unexpected end of JSON input")
test(`raise:
JSON.parse("[1, 2, ; abc=10");
`, "SyntaxError: invalid character ';' looking for beginning of value")
test(`raise:
JSON.parse("[1, 2, function(){}]");
`, "SyntaxError: invalid character 'u' in literal false (expecting 'a')")
})
}
func TestJSON_stringify(t *testing.T) {
tt(t, func() {
test, _ := test()
defer mockUTC()()
test(`
JSON.stringify(function(){});
`, "undefined")
test(`
JSON.stringify(new Boolean(false));
`, "false")
test(`
JSON.stringify({a1: {b1: [1,2,3,4], b2: {c1: 1, c2: 2}}, a2: 'a2'}, null, -5);
`, `{"a1":{"b1":[1,2,3,4],"b2":{"c1":1,"c2":2}},"a2":"a2"}`)
test(`
JSON.stringify(undefined);
`, "undefined")
test(`
JSON.stringify(1);
`, "1")
test(`
JSON.stringify("abc def");
`, "\"abc def\"")
test(`
JSON.stringify(3.14159);
`, "3.14159")
test(`
JSON.stringify([]);
`, "[]")
test(`
JSON.stringify([1, 2, 3]);
`, "[1,2,3]")
test(`
JSON.stringify([true, false, null]);
`, "[true,false,null]")
test(`
JSON.stringify({
abc: { x: 100, y: 110 },
def: [ 10, 20, 30 ],
ghi: "zazazaza"
});
`, `{"abc":{"x":100,"y":110},"def":[10,20,30],"ghi":"zazazaza"}`)
test(`
JSON.stringify([
'e',
{pluribus: 'unum'}
], null, '\t');
`, "[\n\t\"e\",\n\t{\n\t\t\"pluribus\": \"unum\"\n\t}\n]")
test(`
JSON.stringify(new Date(0));
`, `"1970-01-01T00:00:00.000Z"`)
test(`
JSON.stringify([ new Date(0) ], function(key, value){
return this[key] instanceof Date ? 'Date(' + this[key] + ')' : value
});
`, `["Date(Thu, 01 Jan 1970 00:00:00 UTC)"]`)
test(`
JSON.stringify({
abc: 1,
def: 2,
ghi: 3
}, ['abc','def']);
`, `{"abc":1,"def":2}`)
test(`raise:
var abc = {
def: null
};
abc.def = abc;
JSON.stringify(abc)
`, "TypeError: Converting circular structure to JSON")
test(`raise:
var abc= [ null ];
abc[0] = abc;
JSON.stringify(abc);
`, "TypeError: Converting circular structure to JSON")
test(`raise:
var abc = {
def: {}
};
abc.def.ghi = abc;
JSON.stringify(abc)
`, "TypeError: Converting circular structure to JSON")
test(`
var ghi = { "pi": 3.14159 };
var abc = {
def: {}
};
abc.ghi = ghi;
abc.def.ghi = ghi;
JSON.stringify(abc);
`, `{"def":{"ghi":{"pi":3.14159}},"ghi":{"pi":3.14159}}`)
})
}