From b699a36444a03a6f7b312e805de31395a2d2ff9c Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Wed, 2 Jun 2021 12:58:08 -0400 Subject: JSONBuilder (#1865) * #include an absolute path didn't work - because paths were taken to always be relative. * WIP JSONWriter/JSONParser. * Checking different Layout styles for JSON. * Add slang-json-parser.h/.cpp * WIP JSONValue. * Added JSONValue::destroy/Recursive. * Improvement to JSONValue. * Improve text double conversion precision. Testing. * Simplify double parsing (just use atof). JSON comparison More testing of conversions and start of JSONValue. * Add for isnan, isinf etc. * Small improvement with object comparison. * Fix typo in getArgsByName. * Removed use of isnan and isinf as includes don't work on linux. * Improve JSON unit test. * Added asInteger/asFloat/asBool to JSONValue. * Add SourceLoc to JSONListener. * Added ability to walk the JSONValue * JSONBuilder. * Add converting from lexemes via JSONBuilder. * Fix VS warning. * Fix warning for res not being used. --- tools/slang-test/unit-test-json.cpp | 70 +++++++++++++++++++++++++++++++------ 1 file changed, 60 insertions(+), 10 deletions(-) (limited to 'tools') diff --git a/tools/slang-test/unit-test-json.cpp b/tools/slang-test/unit-test-json.cpp index bcd5bf1f0..dad5153c1 100644 --- a/tools/slang-test/unit-test-json.cpp +++ b/tools/slang-test/unit-test-json.cpp @@ -50,7 +50,7 @@ static SlangResult _lex(const char* in, DiagnosticSink* sink, List& t return SLANG_OK; } -static SlangResult _parse(const char* in, DiagnosticSink* sink, JSONWriter& writer) +static SlangResult _parse(const char* in, DiagnosticSink* sink, JSONListener* listener) { SourceManager* sourceManager = sink->getSourceManager(); @@ -62,7 +62,7 @@ static SlangResult _parse(const char* in, DiagnosticSink* sink, JSONWriter& writ lexer.init(sourceView, sink); JSONParser parser; - SLANG_RETURN_ON_FAIL(parser.parse(&lexer, sourceView, &writer, sink)); + SLANG_RETURN_ON_FAIL(parser.parse(&lexer, sourceView, listener, sink)); return SLANG_OK; } @@ -201,10 +201,10 @@ static void jsonUnitTest() auto style = JSONWriter::IndentationStyle::Allman; JSONWriter writer(style); - _parse(in, &sink, writer); + _parse(in, &sink, &writer); JSONWriter writerCheck(style); - _parse(writer.getBuilder().getBuffer(), &sink, writerCheck); + _parse(writer.getBuilder().getBuffer(), &sink, &writerCheck); SLANG_CHECK(writerCheck.getBuilder() == writer.getBuilder()); } @@ -213,22 +213,39 @@ static void jsonUnitTest() auto style = JSONWriter::IndentationStyle::KNR; JSONWriter writer(style, 80); - _parse(in, &sink, writer); + _parse(in, &sink, &writer); JSONWriter writerCheck(style); - _parse(writer.getBuilder().getBuffer(), &sink, writerCheck); + _parse(writer.getBuilder().getBuffer(), &sink, &writerCheck); SLANG_CHECK(writerCheck.getBuilder() == writer.getBuilder()); } - } + { + // Let's parse into a Value + RefPtr container = new JSONContainer(&sourceManager); + JSONValue value; + { + JSONBuilder builder(container); - { - JSONValue value; + SLANG_CHECK(SLANG_SUCCEEDED(_parse(in, &sink, &builder))); + value = builder.getRootValue(); + } + // Let's recreate + JSONValue copy; + { + JSONBuilder builder(container); + container->traverseRecursively(value, &builder); + copy = builder.getRootValue(); + } - value = JSONValue::makeBool(true); + SLANG_CHECK(container->areEqual(value, copy)); + } + } + + { // Only need a SourceManager if we are going to store lexemes RefPtr container = new JSONContainer(nullptr); @@ -250,6 +267,12 @@ static void jsonUnitTest() // Check the values are the same SLANG_CHECK(container->areEqual(arrayView.getBuffer(), values.getBuffer(), arrayView.getCount())); + + { + JSONWriter writer(JSONWriter::IndentationStyle::KNR, 80); + + container->traverseRecursively(array, &writer); + } } { JSONValue obj = JSONValue::makeEmptyObject(); @@ -266,6 +289,33 @@ static void jsonUnitTest() SLANG_CHECK(objView[0].value.asInteger() == 10); } } + + // Check repeated keys works out + // Check out comparison works with different key orders + { + RefPtr container = new JSONContainer(&sourceManager); + const char aText[] = "{ \"a\" : 10, \"b\" : 20.0, \"a\" : \"Hello\" }"; + + + JSONBuilder builder(container); + SLANG_CHECK(SLANG_SUCCEEDED(_parse(aText, &sink, &builder))); + const JSONValue a = builder.getRootValue(); + + builder.reset(); + + const char bText[] = "{ \"b\" : 20.0, \"a\" : \"Hello\"}"; + SLANG_CHECK(SLANG_SUCCEEDED(_parse(bText, &sink, &builder))); + const JSONValue b = builder.getRootValue(); + + SLANG_CHECK(container->areEqual(a, b)); + + JSONBuilder convertBuilder(container, JSONBuilder::Flag::ConvertLexemes); + + SLANG_CHECK(SLANG_SUCCEEDED(_parse(aText, &sink, &convertBuilder))); + const JSONValue c = builder.getRootValue(); + + SLANG_CHECK(container->areEqual(a, c)); + } } SLANG_UNIT_TEST("JSON", jsonUnitTest); -- cgit v1.2.3