diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2021-06-02 12:58:08 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-06-02 09:58:08 -0700 |
| commit | b699a36444a03a6f7b312e805de31395a2d2ff9c (patch) | |
| tree | edcb033b9b81c487f9000ca1f8dd818a063aaa39 /tools/slang-test/unit-test-json.cpp | |
| parent | 7a3c87b58de2683c077bd5341052c2e3cebeb048 (diff) | |
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 <math.h> 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.
Diffstat (limited to 'tools/slang-test/unit-test-json.cpp')
| -rw-r--r-- | tools/slang-test/unit-test-json.cpp | 70 |
1 files changed, 60 insertions, 10 deletions
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<JSONToken>& 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<JSONContainer> 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<JSONContainer> 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<JSONContainer> 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); |
