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