#include #include #include #include #include using namespace Lgs; using namespace Lgs::Json; namespace { struct JsonParserTest : public ::testing::Test { Value parse(const std::string& str) { Value v; parseJson(str, v); return v; } }; } TEST_F(JsonParserTest, CanParseEmptyStringValues) { EXPECT_NO_THROW(parse("[\"\"]")); } TEST_F(JsonParserTest, ThrowsOnEmptyMemberName) { EXPECT_THROW(parse("{\"\":5}"), ParseError); } namespace Lgs { namespace Json { class Accessor { public: Accessor(Value& v) : v_(v) {} Value& child(const std::string& name) { return boost::get(v_).at(name); } template T& childAs(const std::string& name) { return boost::get(child(name)); } private: Value& v_; }; Accessor get(Value& v) { return Accessor(v); } } } TEST_F(JsonParserTest, CanParseNullMember) { Value obj = parse("{\"mem\":null}"); ASSERT_EQ(typeid(NullT), get(obj).child("mem").type()); } TEST_F(JsonParserTest, CanParseBoolanMember) { Value objTrue = parse("{\"mem\":true}"); ASSERT_EQ(typeid(bool), get(objTrue).child("mem").type()); Value objFalse = parse("{\"mem\":false}"); ASSERT_EQ(typeid(bool), get(objFalse).child("mem").type()); } TEST_F(JsonParserTest, CanParseIntMember) { Value obj = parse("{\"mem\":1234}"); ASSERT_EQ(typeid(int), get(obj).child("mem").type()); } TEST_F(JsonParserTest, CanParseStringMember) { Value obj = parse("{\"mem\":\"1234\"}"); ASSERT_EQ(typeid(std::string), get(obj).child("mem").type()); } TEST_F(JsonParserTest, CanParseMalformedNullMembers) { Value obj = parse("{\"mem\":}"); ASSERT_EQ(typeid(NullT), get(obj).child("mem").type()); } TEST_F(JsonParserTest, CanParseEmptyArray) { Value obj = parse("{\"units\" : []}"); ASSERT_EQ(typeid(Array), get(obj).child("mem").type()); } TEST_F(JsonParserTest, DISABLED_ComplexFileParsing) { std::ifstream ifs("d:\\dropbox\\dump.json"); Lgs::Json::Value v; try { Lgs::Json::parseJson(ifs, v); ASSERT_TRUE(true); } catch (Lgs::Json::ParseError& e) { ASSERT_TRUE(false); } }