summaryrefslogtreecommitdiffstats
path: root/tools/slang-test/unit-test-json.cpp
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2021-06-02 12:58:08 -0400
committerGitHub <noreply@github.com>2021-06-02 09:58:08 -0700
commitb699a36444a03a6f7b312e805de31395a2d2ff9c (patch)
treeedcb033b9b81c487f9000ca1f8dd818a063aaa39 /tools/slang-test/unit-test-json.cpp
parent7a3c87b58de2683c077bd5341052c2e3cebeb048 (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.cpp70
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);