VariantValueTest.cpp revision 7a337af9e8bc752a2d3b227e4058ed2baf7a19d1
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.isTypedMatcher<clang::Decl>()); 32 EXPECT_FALSE(Value.isTypedMatcher<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 42 EXPECT_FALSE(Value.isUnsigned()); 43 EXPECT_FALSE(Value.isMatcher()); 44 EXPECT_FALSE(Value.isTypedMatcher<clang::Decl>()); 45 EXPECT_FALSE(Value.isTypedMatcher<clang::UnaryOperator>()); 46} 47 48TEST(VariantValueTest, DynTypedMatcher) { 49 VariantValue Value = stmt(); 50 51 EXPECT_FALSE(Value.isUnsigned()); 52 EXPECT_FALSE(Value.isString()); 53 54 EXPECT_TRUE(Value.isMatcher()); 55 EXPECT_TRUE(Value.isTypedMatcher<clang::Decl>()); 56 EXPECT_TRUE(Value.isTypedMatcher<clang::UnaryOperator>()); 57 58 // Conversion to any type of matcher works. 59 // If they are not compatible it would just return a matcher that matches 60 // nothing. We test this below. 61 Value = recordDecl(); 62 EXPECT_TRUE(Value.isMatcher()); 63 EXPECT_TRUE(Value.isTypedMatcher<clang::Decl>()); 64 EXPECT_TRUE(Value.isTypedMatcher<clang::UnaryOperator>()); 65 66 Value = unaryOperator(); 67 EXPECT_TRUE(Value.isMatcher()); 68 EXPECT_TRUE(Value.isTypedMatcher<clang::Decl>()); 69 EXPECT_TRUE(Value.isTypedMatcher<clang::Stmt>()); 70 EXPECT_TRUE(Value.isTypedMatcher<clang::UnaryOperator>()); 71} 72 73TEST(VariantValueTest, Assignment) { 74 VariantValue Value = std::string("A"); 75 EXPECT_TRUE(Value.isString()); 76 EXPECT_EQ("A", Value.getString()); 77 EXPECT_FALSE(Value.isUnsigned()); 78 EXPECT_FALSE(Value.isMatcher()); 79 80 Value = recordDecl(); 81 EXPECT_FALSE(Value.isUnsigned()); 82 EXPECT_FALSE(Value.isString()); 83 EXPECT_TRUE(Value.isMatcher()); 84 EXPECT_TRUE(Value.isTypedMatcher<clang::Decl>()); 85 EXPECT_TRUE(Value.isTypedMatcher<clang::UnaryOperator>()); 86 87 Value = 17; 88 EXPECT_TRUE(Value.isUnsigned()); 89 EXPECT_EQ(17U, Value.getUnsigned()); 90 EXPECT_FALSE(Value.isMatcher()); 91 EXPECT_FALSE(Value.isString()); 92 93 Value = VariantValue(); 94 EXPECT_FALSE(Value.isUnsigned()); 95 EXPECT_FALSE(Value.isString()); 96 EXPECT_FALSE(Value.isMatcher()); 97} 98 99TEST(GeneicValueTest, Matcher) { 100 EXPECT_TRUE(matchesDynamic( 101 "class X {};", VariantValue(recordDecl(hasName("X"))).getMatcher())); 102 EXPECT_TRUE(matchesDynamic( 103 "int x;", VariantValue(varDecl()).getTypedMatcher<clang::Decl>())); 104 EXPECT_TRUE(matchesDynamic("int foo() { return 1 + 1; }", 105 VariantValue(functionDecl()).getMatcher())); 106 // Going through the wrong Matcher<T> will fail to match, even if the 107 // underlying matcher is correct. 108 EXPECT_FALSE(matchesDynamic( 109 "int x;", VariantValue(varDecl()).getTypedMatcher<clang::Stmt>())); 110 111 EXPECT_FALSE( 112 matchesDynamic("int x;", VariantValue(functionDecl()).getMatcher())); 113 EXPECT_FALSE(matchesDynamic( 114 "int foo() { return 1 + 1; }", 115 VariantValue(declRefExpr()).getTypedMatcher<clang::DeclRefExpr>())); 116} 117 118} // end anonymous namespace 119} // end namespace dynamic 120} // end namespace ast_matchers 121} // end namespace clang 122