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);
	}
Example #5
0
// 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);
	}
Example #11
0
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;
}