TEST(JSONReaderTest, TrailingGarbage) { EXPECT_THROW(JSONReader().read_string("true true"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("true \ntrue"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("true \ntrue "), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("true \n true "), JSONReader::Exception); }
TEST(JSONReaderTest, LeadingAndTrailingSpaceIgnored) { EXPECT_TRUE(JSONReader().read_string("true\n").as_bool()); EXPECT_TRUE(JSONReader().read_string("\ntrue").as_bool()); EXPECT_TRUE(JSONReader().read_string("\ntrue\n").as_bool()); EXPECT_TRUE(JSONReader().read_string(" \n \r\n \t true \n \r\n \t ").as_bool()); EXPECT_TRUE(JSONReader().read_string(" \n \r\n \t true \n \r\n \t ").as_bool()); }
TEST(JSONReaderTest, String) { EXPECT_EQ("", JSONReader().read_string("\"\"").as_string()); EXPECT_EQ("a", JSONReader().read_string("\"a\"").as_string()); EXPECT_EQ("abc", JSONReader().read_string("\"abc\"").as_string()); EXPECT_EQ("\b\t\n\f\r\"\\", JSONReader().read_string("\"\\b\\t\\n\\f\\r\\\"\\\\\"").as_string()); EXPECT_THROW(JSONReader().read_string("\""), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("\"abc\n\""), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("\"\\\u001f\""), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("\"\\a\""), JSONReader::Exception); }
TEST(JSONReaderTest, Nested) { Variant root = JSONReader().read_string("{\"a\": [[1], [2, 3], {\"aa\": 4, \"ab\": {\"abc\": 5 }}]}"); EXPECT_NEAR(1, root.get("a").get(0).get(0).as_double(), 1e-100); EXPECT_NEAR(2, root.get("a").get(1).get(0).as_double(), 1e-100); EXPECT_NEAR(3, root.get("a").get(1).get(1).as_double(), 1e-100); EXPECT_NEAR(4, root.get("a").get(2).get("aa").as_double(), 1e-100); EXPECT_NEAR(5, root.get("a").get(2).get("ab").get("abc").as_double(), 1e-100); }
// static Value* JSONReader::ReadAndReturnError(const std::string& json, bool allow_trailing_comma, int* error_code_out, std::string* error_msg_out) { JSONReader reader = JSONReader(); Value* root = reader.JsonToValue(json, true, allow_trailing_comma); if(root) { return root; } if(error_code_out) { *error_code_out = reader.error_code(); } if(error_msg_out) { *error_msg_out = reader.GetErrorMessage(); } return NULL; }
TEST(JSONReaderTest, Number) { EXPECT_THROW(JSONReader().read_string("-"), JSONReader::Exception); EXPECT_NEAR(0, JSONReader().read_string("0").as_double(), 1e-100); EXPECT_NEAR(0, JSONReader().read_string("-0").as_double(), 1e-100); EXPECT_THROW(JSONReader().read_string("00"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("-00"), JSONReader::Exception); EXPECT_NEAR(123, JSONReader().read_string("123").as_double(), 1e-100); EXPECT_NEAR(-123, JSONReader().read_string("-123").as_double(), 1e-100); EXPECT_THROW(JSONReader().read_string("0123"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("-0123"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("123a"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("-123a"), JSONReader::Exception); EXPECT_NEAR(1.23, JSONReader().read_string("1.23").as_double(), 1e-100); EXPECT_NEAR(-1.23, JSONReader().read_string("-1.23").as_double(), 1e-100); EXPECT_NEAR(12.3, JSONReader().read_string("12.3").as_double(), 1e-100); EXPECT_NEAR(-12.3, JSONReader().read_string("-12.3").as_double(), 1e-100); EXPECT_THROW(JSONReader().read_string("123."), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("-123."), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string(".123"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("-.123"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("12,3"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("-12,3"), JSONReader::Exception); EXPECT_NEAR(123e2, JSONReader().read_string("123e2").as_double(), 1e-100); EXPECT_NEAR(-123e2, JSONReader().read_string("-123e2").as_double(), 1e-100); EXPECT_NEAR(123e+2, JSONReader().read_string("123e+2").as_double(), 1e-100); EXPECT_NEAR(-123e+2, JSONReader().read_string("-123e+2").as_double(), 1e-100); EXPECT_NEAR(123e-2, JSONReader().read_string("123e-2").as_double(), 1e-100); EXPECT_NEAR(-123e-2, JSONReader().read_string("-123e-2").as_double(), 1e-100); EXPECT_THROW(JSONReader().read_string("123e"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("-123e"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("123e."), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("-123e."), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("123e+"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("-123e+"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("123e-"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("-123e-"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("123E2"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("-123E2"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("123e2.0"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("-123e2.0"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("123e2,0"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("-123e2,0"), JSONReader::Exception); }
TEST(JSONReaderTest, Bool) { EXPECT_EQ(true, JSONReader().read_string("true").as_bool()); EXPECT_EQ(false, JSONReader().read_string("false").as_bool()); }
TEST(JSONReaderTest, Null) { EXPECT_TRUE(JSONReader().read_string("null").is_none()); }
TEST(JSONReaderTest, Object) { EXPECT_EQ(0, JSONReader().read_string("{}").as_map().size()); Variant variant1 = JSONReader().read_string("{\"ab\":12}"); EXPECT_EQ(1u, variant1.as_map().size()); EXPECT_NEAR(12, variant1.get("ab").as_double(), 1e-100); Variant variant3 = JSONReader().read_string("{ \"a\": false, \n \"b\":\n \"xyz\",\n\"c\": 3 } "); EXPECT_EQ(3u, variant3.as_map().size()); EXPECT_EQ(false, variant3.get("a").as_bool()); EXPECT_EQ("xyz", variant3.get("b").as_string()); EXPECT_NEAR(3, variant3.get("c").as_double(), 1e-100); EXPECT_THROW(JSONReader().read_string("{"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("{ "), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("{\"a: }"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("{\"a\" }"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("{\"a\": "), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("{\"a\" 1}"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("{\"a\": }"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("{\"a\": 1,}"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("{\"a\": 1 ,}"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("{\"a\": 1 , }"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("{\"duplicate\": 1, \"duplicate\": 2}"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("{12: \"key type not string\"}"), JSONReader::Exception); }
TEST(JSONReaderTest, Array) { EXPECT_EQ(0, JSONReader().read_string("[]").as_vector().size()); Variant variant1 = JSONReader().read_string("[12]"); EXPECT_EQ(1u, variant1.as_vector().size()); EXPECT_NEAR(12, variant1.get(0).as_double(), 1e-100); Variant variant4 = JSONReader().read_string("[ true, 56,\"abc\" \n ,90 \t\n\n\n\t ]"); EXPECT_EQ(4u, variant4.as_vector().size()); EXPECT_EQ(true, variant4.get(0).as_bool()); EXPECT_NEAR(56, variant4.get(1).as_double(), 1e-100); EXPECT_EQ("abc", variant4.get(2).as_string()); EXPECT_NEAR(90, variant4.get(3).as_double(), 1e-100); EXPECT_THROW(JSONReader().read_string("["), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("[ "), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("[1,"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("[1,]"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("[1, ]"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("[1,,]"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("[1, ,]"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("[1, , ]"), JSONReader::Exception); EXPECT_THROW(JSONReader().read_string("[1,\"]\""), JSONReader::Exception); }
int main(int argc, char* argv[]) { int iRes=-1; FSCInit(); try { // Command line parsing CFSAString InFileName, OutFileName, LexFileName="et3.dct"; for (int i=1; i<argc; i++) { if (CFSAString("-help")==argv[i]) { return PrintUsage(); } else if (CFSAString("-lex")==argv[i]) { if (i+1<argc) { LexFileName=argv[++i]; } else { return PrintUsage(); } } else if (CFSAString("-in")==argv[i]) { if (i+1<argc) { InFileName=argv[++i]; } else { return PrintUsage(); } } else if (CFSAString("-out")==argv[i]) { if (i+1<argc) { OutFileName=argv[++i]; } else { return PrintUsage(); } } else { return PrintUsage(); } } // Initialize streams and set up analyzer CFSFile InFile, OutFile; if (InFileName.IsEmpty()) { InFile.Attach(stdin, false); } else { InFile.Open(InFileName, "rb"); } if (OutFileName.IsEmpty()) { OutFile.Attach(stdout, false); } else { OutFile.Open(OutFileName, "wb"); } CDisambiguator Disambiguator; Disambiguator.Open(LexFileName); CJSONWriter JSONWriter(OutFile); CMyJSONReader JSONReader(InFile, Disambiguator, JSONWriter); // Run the loop JSONReader.Read(); // Success iRes=0; } catch (const CJSONException &e) { fprintf(stderr, "JSON error: %s\n", (const char *)FSStrTtoA(e.GetText())); } catch (const CDisambiguatorException &e) { fprintf(stderr, "Disambiguator engine error: %s\n", (const char *)FSStrTtoA(e.GetText())); } catch (const CFSFileException &e) { fprintf(stderr, "I/O error: %d\n", e.m_nError); } catch (const CFSException &) { fprintf(stderr, "Internal error\n"); } catch (...) { fprintf(stderr, "Unexpected error\n"); } FSCTerminate(); return iRes; }