diff options
Diffstat (limited to 'deps/v8/test/cctest/test-strings.cc')
-rw-r--r-- | deps/v8/test/cctest/test-strings.cc | 118 |
1 files changed, 105 insertions, 13 deletions
diff --git a/deps/v8/test/cctest/test-strings.cc b/deps/v8/test/cctest/test-strings.cc index 2c66421831..9326c347ec 100644 --- a/deps/v8/test/cctest/test-strings.cc +++ b/deps/v8/test/cctest/test-strings.cc @@ -105,9 +105,9 @@ static const int SUPER_DEEP_DEPTH = 80 * 1024; class Resource: public v8::String::ExternalStringResource { public: Resource(const uc16* data, size_t length): data_(data), length_(length) {} - ~Resource() { i::DeleteArray(data_); } - virtual const uint16_t* data() const { return data_; } - virtual size_t length() const { return length_; } + ~Resource() override { i::DeleteArray(data_); } + const uint16_t* data() const override { return data_; } + size_t length() const override { return length_; } private: const uc16* data_; @@ -119,9 +119,9 @@ class OneByteResource : public v8::String::ExternalOneByteStringResource { public: OneByteResource(const char* data, size_t length) : data_(data), length_(length) {} - ~OneByteResource() { i::DeleteArray(data_); } - virtual const char* data() const { return data_; } - virtual size_t length() const { return length_; } + ~OneByteResource() override { i::DeleteArray(data_); } + const char* data() const override { return data_; } + size_t length() const override { return length_; } private: const char* data_; @@ -1108,6 +1108,98 @@ TEST(JSONStringifySliceMadeExternal) { CompileRun("JSON.stringify(slice)")))); } +TEST(JSONStringifyWellFormed) { + FLAG_harmony_json_stringify = true; + CcTest::InitializeVM(); + v8::HandleScope handle_scope(CcTest::isolate()); + v8::Local<v8::Context> context = CcTest::isolate()->GetCurrentContext(); + + // Test some leading surrogates (U+D800 to U+DBFF). + { // U+D800 + CHECK_EQ( + 0, strcmp("\"\\ud800\"", *v8::String::Utf8Value( + CcTest::isolate(), + CompileRun("JSON.stringify('\\uD800')")))); + v8::Local<v8::String> json = v8_str("\"\\ud800\""); + v8::Local<v8::Value> parsed = + v8::JSON::Parse(context, json).ToLocalChecked(); + CHECK(v8::JSON::Stringify(context, parsed) + .ToLocalChecked() + ->Equals(context, json) + .FromJust()); + } + + { // U+DAAA + CHECK_EQ( + 0, strcmp("\"\\udaaa\"", *v8::String::Utf8Value( + CcTest::isolate(), + CompileRun("JSON.stringify('\\uDAAA')")))); + v8::Local<v8::String> json = v8_str("\"\\udaaa\""); + v8::Local<v8::Value> parsed = + v8::JSON::Parse(context, json).ToLocalChecked(); + CHECK(v8::JSON::Stringify(context, parsed) + .ToLocalChecked() + ->Equals(context, json) + .FromJust()); + } + + { // U+DBFF + CHECK_EQ( + 0, strcmp("\"\\udbff\"", *v8::String::Utf8Value( + CcTest::isolate(), + CompileRun("JSON.stringify('\\uDBFF')")))); + v8::Local<v8::String> json = v8_str("\"\\udbff\""); + v8::Local<v8::Value> parsed = + v8::JSON::Parse(context, json).ToLocalChecked(); + CHECK(v8::JSON::Stringify(context, parsed) + .ToLocalChecked() + ->Equals(context, json) + .FromJust()); + } + + // Test some trailing surrogates (U+DC00 to U+DFFF). + { // U+DC00 + CHECK_EQ( + 0, strcmp("\"\\udc00\"", *v8::String::Utf8Value( + CcTest::isolate(), + CompileRun("JSON.stringify('\\uDC00')")))); + v8::Local<v8::String> json = v8_str("\"\\udc00\""); + v8::Local<v8::Value> parsed = + v8::JSON::Parse(context, json).ToLocalChecked(); + CHECK(v8::JSON::Stringify(context, parsed) + .ToLocalChecked() + ->Equals(context, json) + .FromJust()); + } + + { // U+DDDD + CHECK_EQ( + 0, strcmp("\"\\udddd\"", *v8::String::Utf8Value( + CcTest::isolate(), + CompileRun("JSON.stringify('\\uDDDD')")))); + v8::Local<v8::String> json = v8_str("\"\\udddd\""); + v8::Local<v8::Value> parsed = + v8::JSON::Parse(context, json).ToLocalChecked(); + CHECK(v8::JSON::Stringify(context, parsed) + .ToLocalChecked() + ->Equals(context, json) + .FromJust()); + } + + { // U+DFFF + CHECK_EQ( + 0, strcmp("\"\\udfff\"", *v8::String::Utf8Value( + CcTest::isolate(), + CompileRun("JSON.stringify('\\uDFFF')")))); + v8::Local<v8::String> json = v8_str("\"\\udfff\""); + v8::Local<v8::Value> parsed = + v8::JSON::Parse(context, json).ToLocalChecked(); + CHECK(v8::JSON::Stringify(context, parsed) + .ToLocalChecked() + ->Equals(context, json) + .FromJust()); + } +} TEST(CachedHashOverflow) { CcTest::InitializeVM(); @@ -1186,9 +1278,9 @@ class OneByteVectorResource : public v8::String::ExternalOneByteStringResource { public: explicit OneByteVectorResource(i::Vector<const char> vector) : data_(vector) {} - virtual ~OneByteVectorResource() {} - virtual size_t length() const { return data_.length(); } - virtual const char* data() const { return data_.start(); } + ~OneByteVectorResource() override = default; + size_t length() const override { return data_.length(); } + const char* data() const override { return data_.start(); } private: i::Vector<const char> data_; }; @@ -1464,15 +1556,15 @@ TEST(Latin1IgnoreCase) { class DummyResource: public v8::String::ExternalStringResource { public: - virtual const uint16_t* data() const { return nullptr; } - virtual size_t length() const { return 1 << 30; } + const uint16_t* data() const override { return nullptr; } + size_t length() const override { return 1 << 30; } }; class DummyOneByteResource: public v8::String::ExternalOneByteStringResource { public: - virtual const char* data() const { return nullptr; } - virtual size_t length() const { return 1 << 30; } + const char* data() const override { return nullptr; } + size_t length() const override { return 1 << 30; } }; |