Do not serialize properties for Sets. Serialization tests for Map and Set.
This was SVN commit r16620.
This commit is contained in:
parent
ee17247ee5
commit
b8a20c958c
@ -284,6 +284,8 @@ void CBinarySerializerScriptImpl::HandleScriptVal(JS::HandleValue val)
|
||||
|
||||
HandleScriptVal(value);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2013 Wildfire Games.
|
||||
/* Copyright (C) 2015 Wildfire Games.
|
||||
* This file is part of 0 A.D.
|
||||
*
|
||||
* 0 A.D. is free software: you can redistribute it and/or modify
|
||||
@ -264,83 +264,7 @@ public:
|
||||
|
||||
// TODO: test exceptions more thoroughly
|
||||
|
||||
void test_script_basic()
|
||||
{
|
||||
ScriptInterface script("Test", "Test", g_ScriptRuntime);
|
||||
JSContext* cx = script.GetContext();
|
||||
JSAutoRequest rq(cx);
|
||||
|
||||
JS::RootedValue obj(cx);
|
||||
TS_ASSERT(script.Eval("({'x': 123, 'y': [1, 1.5, '2', 'test', undefined, null, true, false]})", &obj));
|
||||
|
||||
{
|
||||
std::stringstream stream;
|
||||
CDebugSerializer serialize(script, stream);
|
||||
serialize.ScriptVal("script", &obj);
|
||||
TS_ASSERT_STR_EQUALS(stream.str(),
|
||||
"script: {\n"
|
||||
" \"x\": 123,\n"
|
||||
" \"y\": [\n"
|
||||
" 1,\n"
|
||||
" 1.5,\n"
|
||||
" \"2\",\n"
|
||||
" \"test\",\n"
|
||||
" null,\n"
|
||||
" null,\n"
|
||||
" true,\n"
|
||||
" false\n"
|
||||
" ]\n"
|
||||
"}\n");
|
||||
}
|
||||
|
||||
{
|
||||
std::stringstream stream;
|
||||
CStdSerializer serialize(script, stream);
|
||||
|
||||
serialize.ScriptVal("script", &obj);
|
||||
|
||||
TS_ASSERT_STREAM(stream, 119,
|
||||
"\x03" // SCRIPT_TYPE_OBJECT
|
||||
"\x02\0\0\0" // num props
|
||||
"\x01\0\0\0" "x\0" // "x"
|
||||
"\x05" // SCRIPT_TYPE_INT
|
||||
"\x7b\0\0\0" // 123
|
||||
"\x01\0\0\0" "y\0" // "y"
|
||||
"\x02" // SCRIPT_TYPE_ARRAY
|
||||
"\x08\0\0\0" // array length
|
||||
"\x08\0\0\0" // num props
|
||||
"\x01\0\0\0" "0\0" // "0"
|
||||
"\x05" "\x01\0\0\0" // SCRIPT_TYPE_INT 1
|
||||
"\x01\0\0\0" "1\0" // "1"
|
||||
"\x06" "\0\0\0\0\0\0\xf8\x3f" // SCRIPT_TYPE_DOUBLE 1.5
|
||||
"\x01\0\0\0" "2\0" // "2"
|
||||
"\x04" "\x01\0\0\0" "2\0" // SCRIPT_TYPE_STRING "2"
|
||||
"\x01\0\0\0" "3\0" // "3"
|
||||
"\x04" "\x04\0\0\0" "t\0e\0s\0t\0" // SCRIPT_TYPE_STRING "test"
|
||||
"\x01\0\0\0" "4\0" // "4"
|
||||
"\x00" // SCRIPT_TYPE_VOID
|
||||
"\x01\0\0\0" "5\0" // "5"
|
||||
"\x01" // SCRIPT_TYPE_NULL
|
||||
"\x01\0\0\0" "6\0" // "6"
|
||||
"\x07" "\x01" // SCRIPT_TYPE_BOOLEAN true
|
||||
"\x01\0\0\0" "7\0" // "7"
|
||||
"\x07" "\x00" // SCRIPT_TYPE_BOOLEAN false
|
||||
);
|
||||
|
||||
CStdDeserializer deserialize(script, stream);
|
||||
|
||||
JS::RootedValue newobj(cx);
|
||||
deserialize.ScriptVal("script", &newobj);
|
||||
TS_ASSERT(stream.good());
|
||||
TS_ASSERT_EQUALS(stream.peek(), EOF);
|
||||
|
||||
std::string source;
|
||||
TS_ASSERT(script.CallFunction(newobj, "toSource", source));
|
||||
TS_ASSERT_STR_EQUALS(source, "({x:123, y:[1, 1.5, \"2\", \"test\", (void 0), null, true, false]})");
|
||||
}
|
||||
}
|
||||
|
||||
void helper_script_roundtrip(const char* msg, const char* input, const char* expected, size_t expstreamlen = 0, const char* expstream = NULL)
|
||||
void helper_script_roundtrip(const char* msg, const char* input, const char* expected, size_t expstreamlen = 0, const char* expstream = NULL, const char* debug = NULL)
|
||||
{
|
||||
ScriptInterface script("Test", "Test", g_ScriptRuntime);
|
||||
JSContext* cx = script.GetContext();
|
||||
@ -349,6 +273,14 @@ public:
|
||||
JS::RootedValue obj(cx);
|
||||
TSM_ASSERT(msg, script.Eval(input, &obj));
|
||||
|
||||
if (debug)
|
||||
{
|
||||
std::stringstream dbgstream;
|
||||
CDebugSerializer serialize(script, dbgstream);
|
||||
serialize.ScriptVal("script", &obj);
|
||||
TS_ASSERT_STR_EQUALS(dbgstream.str(), debug);
|
||||
}
|
||||
|
||||
std::stringstream stream;
|
||||
CStdSerializer serialize(script, stream);
|
||||
|
||||
@ -371,6 +303,56 @@ public:
|
||||
TS_ASSERT_STR_EQUALS(source, expected);
|
||||
}
|
||||
|
||||
void test_script_basic()
|
||||
{
|
||||
helper_script_roundtrip("Object",
|
||||
"({'x': 123, 'y': [1, 1.5, '2', 'test', undefined, null, true, false]})",
|
||||
/* expected: */
|
||||
"({x:123, y:[1, 1.5, \"2\", \"test\", (void 0), null, true, false]})",
|
||||
/* expected stream: */
|
||||
119,
|
||||
"\x03" // SCRIPT_TYPE_OBJECT
|
||||
"\x02\0\0\0" // num props
|
||||
"\x01\0\0\0" "x\0" // "x"
|
||||
"\x05" // SCRIPT_TYPE_INT
|
||||
"\x7b\0\0\0" // 123
|
||||
"\x01\0\0\0" "y\0" // "y"
|
||||
"\x02" // SCRIPT_TYPE_ARRAY
|
||||
"\x08\0\0\0" // array length
|
||||
"\x08\0\0\0" // num props
|
||||
"\x01\0\0\0" "0\0" // "0"
|
||||
"\x05" "\x01\0\0\0" // SCRIPT_TYPE_INT 1
|
||||
"\x01\0\0\0" "1\0" // "1"
|
||||
"\x06" "\0\0\0\0\0\0\xf8\x3f" // SCRIPT_TYPE_DOUBLE 1.5
|
||||
"\x01\0\0\0" "2\0" // "2"
|
||||
"\x04" "\x01\0\0\0" "2\0" // SCRIPT_TYPE_STRING "2"
|
||||
"\x01\0\0\0" "3\0" // "3"
|
||||
"\x04" "\x04\0\0\0" "t\0e\0s\0t\0" // SCRIPT_TYPE_STRING "test"
|
||||
"\x01\0\0\0" "4\0" // "4"
|
||||
"\x00" // SCRIPT_TYPE_VOID
|
||||
"\x01\0\0\0" "5\0" // "5"
|
||||
"\x01" // SCRIPT_TYPE_NULL
|
||||
"\x01\0\0\0" "6\0" // "6"
|
||||
"\x07" "\x01" // SCRIPT_TYPE_BOOLEAN true
|
||||
"\x01\0\0\0" "7\0" // "7"
|
||||
"\x07" "\x00", // SCRIPT_TYPE_BOOLEAN false
|
||||
/* expected debug: */
|
||||
"script: {\n"
|
||||
" \"x\": 123,\n"
|
||||
" \"y\": [\n"
|
||||
" 1,\n"
|
||||
" 1.5,\n"
|
||||
" \"2\",\n"
|
||||
" \"test\",\n"
|
||||
" null,\n"
|
||||
" null,\n"
|
||||
" true,\n"
|
||||
" false\n"
|
||||
" ]\n"
|
||||
"}\n"
|
||||
);
|
||||
}
|
||||
|
||||
void test_script_unicode()
|
||||
{
|
||||
helper_script_roundtrip("unicode", "({"
|
||||
@ -533,6 +515,70 @@ public:
|
||||
);
|
||||
}
|
||||
|
||||
void test_script_map()
|
||||
{
|
||||
helper_script_roundtrip("Map - empty",
|
||||
"(new Map())",
|
||||
/* expected: */
|
||||
"({})",
|
||||
/* expected stream: */
|
||||
5,
|
||||
"\x0f" // SCRIPT_TYPE_MAP
|
||||
"\x00\x00\x00\x00" // size
|
||||
);
|
||||
|
||||
helper_script_roundtrip("Map with elements and property",
|
||||
"var a = new Map(); a.set(12, 16); a.set(\"bar\", \"baz\"); a.foo = 27; a",
|
||||
/* expected: */
|
||||
"({})",
|
||||
/* expected stream: */
|
||||
37,
|
||||
"\x0f" // SCRIPT_TYPE_MAP
|
||||
"\x02\0\0\0" // size
|
||||
|
||||
"\x05" // SCRIPT_TYPE_INT
|
||||
"\x0C\0\0\0" // 12
|
||||
"\x05" // SCRIPT_TYPE_INT
|
||||
"\x10\0\0\0" // 16
|
||||
|
||||
"\x04" // SCRIPT_TYPE_STRING
|
||||
"\x03\0\0\0" "b\0a\0r\0" // "bar"
|
||||
"\x04" // SCRIPT_TYPE_STRING
|
||||
"\x03\0\0\0" "b\0a\0z\0" // "baz"
|
||||
// NOTE: We drop properties on Maps when serializing
|
||||
);
|
||||
}
|
||||
|
||||
void test_script_set()
|
||||
{
|
||||
helper_script_roundtrip("Set - empty",
|
||||
"(new Set())",
|
||||
/* expected: */
|
||||
"({})",
|
||||
/* expected stream: */
|
||||
5,
|
||||
"\x10" // SCRIPT_TYPE_SET
|
||||
"\x00\x00\x00\x00" // size
|
||||
);
|
||||
|
||||
helper_script_roundtrip("Set with elements and property",
|
||||
"var a = new Set(); a.add(12); a.add(\"bar\"); a.foo = 27; a",
|
||||
/* expected: */
|
||||
"({})",
|
||||
/* expected stream: */
|
||||
21,
|
||||
"\x10" // SCRIPT_TYPE_SET
|
||||
"\x02\0\0\0" // size
|
||||
|
||||
"\x05" // SCRIPT_TYPE_INT
|
||||
"\x0C\0\0\0" // 12
|
||||
|
||||
"\x04" // SCRIPT_TYPE_STRING
|
||||
"\x03\0\0\0" "b\0a\0r\0" // "bar"
|
||||
// NOTE: We drop properties on Sets when serializing
|
||||
);
|
||||
}
|
||||
|
||||
// TODO: prototype objects
|
||||
|
||||
void test_script_nonfinite()
|
||||
|
Loading…
Reference in New Issue
Block a user