VariantValueTest.cpp revision 76c2f92c4b4ab7e02857661a05e53ba4b501d87a
1//===- unittest/ASTMatchers/Dynamic/VariantValueTest.cpp - VariantValue unit tests -===// 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 "../ASTMatchersTest.h" 11#include "clang/ASTMatchers/Dynamic/VariantValue.h" 12#include "gtest/gtest.h" 13 14namespace clang { 15namespace ast_matchers { 16namespace dynamic { 17namespace { 18 19using ast_matchers::internal::DynTypedMatcher; 20using ast_matchers::internal::Matcher; 21 22TEST(VariantValueTest, Unsigned) { 23 const unsigned kUnsigned = 17; 24 VariantValue Value = kUnsigned; 25 26 EXPECT_TRUE(Value.isUnsigned()); 27 EXPECT_EQ(kUnsigned, Value.getUnsigned()); 28 29 EXPECT_FALSE(Value.isString()); 30 EXPECT_FALSE(Value.isMatcher()); 31 EXPECT_FALSE(Value.hasTypedMatcher<clang::Decl>()); 32 EXPECT_FALSE(Value.hasTypedMatcher<clang::UnaryOperator>()); 33} 34 35TEST(VariantValueTest, String) { 36 const ::std::string kString = "string"; 37 VariantValue Value = kString; 38 39 EXPECT_TRUE(Value.isString()); 40 EXPECT_EQ(kString, Value.getString()); 41 EXPECT_EQ("String", Value.getTypeAsString()); 42 43 EXPECT_FALSE(Value.isUnsigned()); 44 EXPECT_FALSE(Value.isMatcher()); 45 EXPECT_FALSE(Value.hasTypedMatcher<clang::Decl>()); 46 EXPECT_FALSE(Value.hasTypedMatcher<clang::UnaryOperator>()); 47} 48 49TEST(VariantValueTest, DynTypedMatcher) { 50 VariantValue Value = stmt(); 51 52 EXPECT_FALSE(Value.isUnsigned()); 53 EXPECT_FALSE(Value.isString()); 54 55 EXPECT_TRUE(Value.isMatcher()); 56 EXPECT_FALSE(Value.hasTypedMatcher<clang::Decl>()); 57 EXPECT_TRUE(Value.hasTypedMatcher<clang::UnaryOperator>()); 58 EXPECT_EQ("Matcher<Stmt>", Value.getTypeAsString()); 59 60 // Can only convert to compatible matchers. 61 Value = recordDecl(); 62 EXPECT_TRUE(Value.isMatcher()); 63 EXPECT_TRUE(Value.hasTypedMatcher<clang::Decl>()); 64 EXPECT_FALSE(Value.hasTypedMatcher<clang::UnaryOperator>()); 65 EXPECT_EQ("Matcher<Decl>", Value.getTypeAsString()); 66 67 Value = ignoringImpCasts(expr()); 68 EXPECT_TRUE(Value.isMatcher()); 69 EXPECT_FALSE(Value.hasTypedMatcher<clang::Decl>()); 70 EXPECT_FALSE(Value.hasTypedMatcher<clang::Stmt>()); 71 EXPECT_TRUE(Value.hasTypedMatcher<clang::Expr>()); 72 EXPECT_TRUE(Value.hasTypedMatcher<clang::IntegerLiteral>()); 73 EXPECT_FALSE(Value.hasTypedMatcher<clang::GotoStmt>()); 74 EXPECT_EQ("Matcher<Expr>", Value.getTypeAsString()); 75} 76 77TEST(VariantValueTest, Assignment) { 78 VariantValue Value = std::string("A"); 79 EXPECT_TRUE(Value.isString()); 80 EXPECT_EQ("A", Value.getString()); 81 EXPECT_FALSE(Value.isUnsigned()); 82 EXPECT_FALSE(Value.isMatcher()); 83 EXPECT_EQ("String", Value.getTypeAsString()); 84 85 Value = recordDecl(); 86 EXPECT_FALSE(Value.isUnsigned()); 87 EXPECT_FALSE(Value.isString()); 88 EXPECT_TRUE(Value.isMatcher()); 89 EXPECT_TRUE(Value.hasTypedMatcher<clang::Decl>()); 90 EXPECT_FALSE(Value.hasTypedMatcher<clang::UnaryOperator>()); 91 EXPECT_EQ("Matcher<Decl>", Value.getTypeAsString()); 92 93 Value = 17; 94 EXPECT_TRUE(Value.isUnsigned()); 95 EXPECT_EQ(17U, Value.getUnsigned()); 96 EXPECT_FALSE(Value.isMatcher()); 97 EXPECT_FALSE(Value.isString()); 98 99 Value = VariantValue(); 100 EXPECT_FALSE(Value.isUnsigned()); 101 EXPECT_FALSE(Value.isString()); 102 EXPECT_FALSE(Value.isMatcher()); 103 EXPECT_EQ("Nothing", Value.getTypeAsString()); 104} 105 106TEST(GeneicValueTest, Matcher) { 107 EXPECT_TRUE(matches("class X {};", VariantValue(recordDecl(hasName("X"))) 108 .getTypedMatcher<Decl>())); 109 EXPECT_TRUE( 110 matches("int x;", VariantValue(varDecl()).getTypedMatcher<Decl>())); 111 EXPECT_TRUE(matches("int foo() { return 1 + 1; }", 112 VariantValue(functionDecl()).getTypedMatcher<Decl>())); 113 // Can't get the wrong matcher. 114 EXPECT_FALSE(VariantValue(varDecl()).hasTypedMatcher<Stmt>()); 115#if GTEST_HAS_DEATH_TEST and DEBUG 116 // Trying to get the wrong matcher fails an assertion in Matcher<T>. 117 EXPECT_DEATH(VariantValue(varDecl()).getTypedMatcher<Stmt>(), 118 "canConstructFrom"); 119#endif 120 121 EXPECT_FALSE( 122 matches("int x;", VariantValue(functionDecl()).getTypedMatcher<Decl>())); 123 EXPECT_FALSE(matches("int foo() { return 1 + 1; }", 124 VariantValue(declRefExpr()).getTypedMatcher<Stmt>())); 125} 126 127} // end anonymous namespace 128} // end namespace dynamic 129} // end namespace ast_matchers 130} // end namespace clang 131