michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "gtest/gtest.h" michael@0: michael@0: #include michael@0: #include "JSStreamWriter.h" michael@0: michael@0: TEST(JSStreamWriter, NoOutput) { michael@0: std::stringstream ss; michael@0: JSStreamWriter b(ss); michael@0: ASSERT_TRUE(ss.str().compare("") == 0); michael@0: } michael@0: michael@0: TEST(JSStreamWriter, EmptyObject) { michael@0: std::stringstream ss; michael@0: JSStreamWriter b(ss); michael@0: b.BeginObject(); michael@0: b.EndObject(); michael@0: ASSERT_TRUE(ss.str().compare("{}") == 0); michael@0: } michael@0: michael@0: TEST(JSStreamWriter, OnePropertyObject) { michael@0: std::stringstream ss; michael@0: JSStreamWriter b(ss); michael@0: b.BeginObject(); michael@0: b.Name("a"); michael@0: b.Value(1); michael@0: b.EndObject(); michael@0: ASSERT_TRUE(ss.str().compare("{\"a\":1}") == 0); michael@0: } michael@0: michael@0: TEST(JSStreamWriter, MultiPropertyObject) { michael@0: std::stringstream ss; michael@0: JSStreamWriter b(ss); michael@0: b.BeginObject(); michael@0: b.Name("a"); michael@0: b.Value(1); michael@0: b.Name("b"); michael@0: b.Value(2); michael@0: b.EndObject(); michael@0: ASSERT_TRUE(ss.str().compare("{\"a\":1,\"b\":2}") == 0); michael@0: } michael@0: michael@0: TEST(JSStreamWriter, OnePropertyArray) { michael@0: std::stringstream ss; michael@0: JSStreamWriter b(ss); michael@0: b.BeginArray(); michael@0: b.Value(1); michael@0: b.EndArray(); michael@0: ASSERT_TRUE(ss.str().compare("[1]") == 0); michael@0: } michael@0: michael@0: TEST(JSStreamWriter, MultiPropertyArray) { michael@0: std::stringstream ss; michael@0: JSStreamWriter b(ss); michael@0: b.BeginArray(); michael@0: b.Value(1); michael@0: b.Value(2); michael@0: b.EndArray(); michael@0: ASSERT_TRUE(ss.str().compare("[1,2]") == 0); michael@0: } michael@0: michael@0: TEST(JSStreamWriter, NestedObject) { michael@0: std::stringstream ss; michael@0: JSStreamWriter b(ss); michael@0: b.BeginObject(); michael@0: b.Name("a"); michael@0: b.BeginObject(); michael@0: b.Name("b"); michael@0: b.Value(1); michael@0: b.EndObject(); michael@0: b.EndObject(); michael@0: ASSERT_TRUE(ss.str().compare("{\"a\":{\"b\":1}}") == 0); michael@0: } michael@0: michael@0: TEST(JSStreamWriter, NestedObjectInArray) { michael@0: std::stringstream ss; michael@0: JSStreamWriter b(ss); michael@0: b.BeginArray(); michael@0: b.BeginObject(); michael@0: b.Name("a"); michael@0: b.Value(1); michael@0: b.EndObject(); michael@0: b.EndArray(); michael@0: ASSERT_TRUE(ss.str().compare("[{\"a\":1}]") == 0); michael@0: } michael@0: michael@0: TEST(JSStreamWriter, NestedArrayInObject) { michael@0: std::stringstream ss; michael@0: JSStreamWriter b(ss); michael@0: b.BeginObject(); michael@0: b.Name("a"); michael@0: b.BeginArray(); michael@0: b.Value(1); michael@0: b.EndArray(); michael@0: b.EndObject(); michael@0: ASSERT_TRUE(ss.str().compare("{\"a\":[1]}") == 0); michael@0: } michael@0: michael@0: TEST(JSStreamWriter, StingEscaping) { michael@0: std::stringstream ss; michael@0: JSStreamWriter b(ss); michael@0: b.Value("a\"a"); michael@0: ASSERT_TRUE(ss.str().compare("\"a\\\"a\"") == 0); michael@0: michael@0: std::stringstream ss2; michael@0: JSStreamWriter b2(ss2); michael@0: b2.Value("a\na"); michael@0: ASSERT_TRUE(ss2.str().compare("\"a\\u000Aa\"") == 0); michael@0: } michael@0: michael@0: TEST(JSStreamWriter, ArrayOfOjects) { michael@0: std::stringstream ss; michael@0: JSStreamWriter b(ss); michael@0: b.BeginArray(); michael@0: b.BeginObject(); michael@0: b.EndObject(); michael@0: michael@0: b.BeginObject(); michael@0: b.EndObject(); michael@0: b.EndArray(); michael@0: ASSERT_TRUE(ss.str().compare("[{},{}]") == 0); michael@0: } michael@0: michael@0: TEST(JSStreamWriter, Complex) { michael@0: std::stringstream ss; michael@0: JSStreamWriter b(ss); michael@0: b.BeginObject(); michael@0: b.Name("a"); michael@0: b.BeginArray(); michael@0: b.Value(1); michael@0: michael@0: b.BeginObject(); michael@0: b.EndObject(); michael@0: michael@0: b.BeginObject(); michael@0: b.Name("b"); michael@0: b.Value("c"); michael@0: b.EndObject(); michael@0: b.EndArray(); michael@0: michael@0: b.Name("b"); michael@0: b.BeginArray(); michael@0: b.BeginArray(); michael@0: b.EndArray(); michael@0: b.EndArray(); michael@0: b.EndObject(); michael@0: ASSERT_TRUE(ss.str().compare("{\"a\":[1,{},{\"b\":\"c\"}],\"b\":[[]]}") == 0); michael@0: } michael@0: michael@0: TEST(JSStreamWriter, Complex2) { michael@0: std::stringstream ss; michael@0: JSStreamWriter b(ss); michael@0: b.BeginObject(); michael@0: b.Name("a"); michael@0: b.BeginArray(); michael@0: b.BeginObject(); michael@0: b.Name("b"); michael@0: b.Value("c"); michael@0: b.Name("d"); michael@0: b.BeginArray(); michael@0: b.BeginObject(); michael@0: b.Name("e"); michael@0: b.BeginArray(); michael@0: b.BeginObject(); michael@0: b.Name("f"); michael@0: b.Value("g"); michael@0: b.EndObject(); michael@0: b.BeginObject(); michael@0: b.Name("h"); michael@0: b.Value("i"); michael@0: b.EndObject(); michael@0: b.EndArray(); michael@0: b.EndObject(); michael@0: b.EndArray(); michael@0: b.EndObject(); michael@0: b.EndArray(); michael@0: b.EndObject(); michael@0: ASSERT_TRUE(ss.str().compare("{\"a\":[{\"b\":\"c\",\"d\":[{\"e\":[{\"f\":\"g\"},{\"h\":\"i\"}]}]}]}") michael@0: }