xref: /llvm-project/clang-tools-extra/unittests/clang-query/QueryParserTest.cpp (revision edc9e38810c94626c8ba78801ef81b0ce61ed502)
1 //===---- QueryParserTest.cpp - clang-query test --------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "QueryParser.h"
11 #include "Query.h"
12 #include "QuerySession.h"
13 #include "llvm/LineEditor/LineEditor.h"
14 #include "gtest/gtest.h"
15 
16 using namespace clang;
17 using namespace clang::query;
18 
19 TEST(QueryParser, NoOp) {
20   QueryRef Q = QueryParser::parse("");
21   EXPECT_TRUE(isa<NoOpQuery>(Q));
22 
23   Q = QueryParser::parse("\n");
24   EXPECT_TRUE(isa<NoOpQuery>(Q));
25 }
26 
27 TEST(QueryParser, Invalid) {
28   QueryRef Q = QueryParser::parse("foo");
29   ASSERT_TRUE(isa<InvalidQuery>(Q));
30   EXPECT_EQ("unknown command: foo", cast<InvalidQuery>(Q)->ErrStr);
31 }
32 
33 TEST(QueryParser, Help) {
34   QueryRef Q = QueryParser::parse("help");
35   ASSERT_TRUE(isa<HelpQuery>(Q));
36 
37   Q = QueryParser::parse("help me");
38   ASSERT_TRUE(isa<InvalidQuery>(Q));
39   EXPECT_EQ("unexpected extra input: ' me'", cast<InvalidQuery>(Q)->ErrStr);
40 }
41 
42 TEST(QueryParser, Set) {
43   QueryRef Q = QueryParser::parse("set");
44   ASSERT_TRUE(isa<InvalidQuery>(Q));
45   EXPECT_EQ("expected variable name", cast<InvalidQuery>(Q)->ErrStr);
46 
47   Q = QueryParser::parse("set foo bar");
48   ASSERT_TRUE(isa<InvalidQuery>(Q));
49   EXPECT_EQ("unknown variable: 'foo'", cast<InvalidQuery>(Q)->ErrStr);
50 
51   Q = QueryParser::parse("set output");
52   ASSERT_TRUE(isa<InvalidQuery>(Q));
53   EXPECT_EQ("expected 'diag', 'print' or 'dump', got ''",
54             cast<InvalidQuery>(Q)->ErrStr);
55 
56   Q = QueryParser::parse("set bind-root true foo");
57   ASSERT_TRUE(isa<InvalidQuery>(Q));
58   EXPECT_EQ("unexpected extra input: ' foo'", cast<InvalidQuery>(Q)->ErrStr);
59 
60   Q = QueryParser::parse("set output foo");
61   ASSERT_TRUE(isa<InvalidQuery>(Q));
62   EXPECT_EQ("expected 'diag', 'print' or 'dump', got 'foo'",
63             cast<InvalidQuery>(Q)->ErrStr);
64 
65   Q = QueryParser::parse("set output dump");
66   ASSERT_TRUE(isa<SetQuery<OutputKind> >(Q));
67   EXPECT_EQ(&QuerySession::OutKind, cast<SetQuery<OutputKind> >(Q)->Var);
68   EXPECT_EQ(OK_Dump, cast<SetQuery<OutputKind> >(Q)->Value);
69 
70   Q = QueryParser::parse("set bind-root foo");
71   ASSERT_TRUE(isa<InvalidQuery>(Q));
72   EXPECT_EQ("expected 'true' or 'false', got 'foo'",
73             cast<InvalidQuery>(Q)->ErrStr);
74 
75   Q = QueryParser::parse("set bind-root true");
76   ASSERT_TRUE(isa<SetQuery<bool> >(Q));
77   EXPECT_EQ(&QuerySession::BindRoot, cast<SetQuery<bool> >(Q)->Var);
78   EXPECT_EQ(true, cast<SetQuery<bool> >(Q)->Value);
79 }
80 
81 TEST(QueryParser, Match) {
82   QueryRef Q = QueryParser::parse("match decl()");
83   ASSERT_TRUE(isa<MatchQuery>(Q));
84   EXPECT_TRUE(cast<MatchQuery>(Q)->Matcher.canConvertTo<Decl>());
85 
86   Q = QueryParser::parse("m stmt()");
87   ASSERT_TRUE(isa<MatchQuery>(Q));
88   EXPECT_TRUE(cast<MatchQuery>(Q)->Matcher.canConvertTo<Stmt>());
89 }
90 
91 TEST(QueryParser, Complete) {
92   std::vector<llvm::LineEditor::Completion> Comps =
93       QueryParser::complete("", 0);
94   ASSERT_EQ(3u, Comps.size());
95   EXPECT_EQ("help ", Comps[0].TypedText);
96   EXPECT_EQ("help", Comps[0].DisplayText);
97   EXPECT_EQ("match ", Comps[1].TypedText);
98   EXPECT_EQ("match", Comps[1].DisplayText);
99   EXPECT_EQ("set ", Comps[2].TypedText);
100   EXPECT_EQ("set", Comps[2].DisplayText);
101 
102   Comps = QueryParser::complete("set o", 5);
103   ASSERT_EQ(1u, Comps.size());
104   EXPECT_EQ("utput ", Comps[0].TypedText);
105   EXPECT_EQ("output", Comps[0].DisplayText);
106 
107   Comps = QueryParser::complete("match while", 11);
108   ASSERT_EQ(1u, Comps.size());
109   EXPECT_EQ("Stmt(", Comps[0].TypedText);
110   EXPECT_EQ("Matcher<Stmt> whileStmt(Matcher<WhileStmt>...)",
111             Comps[0].DisplayText);
112 }
113