summaryrefslogtreecommitdiffstats
path: root/unittests
diff options
context:
space:
mode:
authorSam McCall <sam.mccall@gmail.com>2017-11-28 09:25:09 +0000
committerSam McCall <sam.mccall@gmail.com>2017-11-28 09:25:09 +0000
commit2b0a5d888a3fa3c9c779463728a8d409785ea1d4 (patch)
treeffe7e087858df89943471c4ed75ccd73db5c9441 /unittests
parent91c4b98a4f30408b5577d8d8f21a42ccd2046d44 (diff)
[clangd] Add missing (but documented!) JSONExpr typed accessors
Summary: Noticed this when I tried to port the Protocol.h parsers. And tests for the inspect API, which caught a small bug. Reviewers: ioeric Subscribers: ilya-biryukov Differential Revision: https://reviews.llvm.org/D40399 git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@319157 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'unittests')
-rw-r--r--unittests/clangd/JSONExprTests.cpp44
1 files changed, 43 insertions, 1 deletions
diff --git a/unittests/clangd/JSONExprTests.cpp b/unittests/clangd/JSONExprTests.cpp
index d1bcf7a2..4692aded 100644
--- a/unittests/clangd/JSONExprTests.cpp
+++ b/unittests/clangd/JSONExprTests.cpp
@@ -167,7 +167,6 @@ TEST(JSONTest, ParseErrors) {
ExpectErr("Unexpected EOF", "");
ExpectErr("Unexpected EOF", "[");
ExpectErr("Text after end of document", "[][]");
- ExpectErr("Text after end of document", "[][]");
ExpectErr("Invalid bareword", "fuzzy");
ExpectErr("Expected , or ]", "[2?]");
ExpectErr("Expected object key", "{a:2}");
@@ -185,6 +184,49 @@ TEST(JSONTest, ParseErrors) {
})");
}
+TEST(JSONTest, Inspection) {
+ llvm::Expected<Expr> Doc = parse(R"(
+ {
+ "null": null,
+ "boolean": false,
+ "number": 2.78,
+ "string": "json",
+ "array": [null, true, 3.14, "hello", [1,2,3], {"time": "arrow"}],
+ "object": {"fruit": "banana"}
+ }
+ )");
+ EXPECT_TRUE(!!Doc);
+
+ obj *O = Doc->asObject();
+ ASSERT_TRUE(O);
+
+ EXPECT_FALSE(O->getNull("missing"));
+ EXPECT_FALSE(O->getNull("boolean"));
+ EXPECT_TRUE(O->getNull("null"));
+
+ EXPECT_EQ(O->getNumber("number"), llvm::Optional<double>(2.78));
+ EXPECT_EQ(O->getString("string"), llvm::Optional<llvm::StringRef>("json"));
+ ASSERT_FALSE(O->getObject("missing"));
+ ASSERT_FALSE(O->getObject("array"));
+ ASSERT_TRUE(O->getObject("object"));
+ EXPECT_EQ(*O->getObject("object"), (obj{{"fruit", "banana"}}));
+
+ ary *A = O->getArray("array");
+ ASSERT_TRUE(A);
+ EXPECT_EQ(A->getBoolean(1), llvm::Optional<bool>(true));
+ ASSERT_TRUE(A->getArray(4));
+ EXPECT_EQ(*A->getArray(4), (ary{1, 2, 3}));
+ int I = 0;
+ for (Expr &E : *A) {
+ if (I++ == 5) {
+ ASSERT_TRUE(E.asObject());
+ EXPECT_EQ(E.asObject()->getString("time"),
+ llvm::Optional<llvm::StringRef>("arrow"));
+ } else
+ EXPECT_FALSE(E.asObject());
+ }
+}
+
} // namespace
} // namespace json
} // namespace clangd