VariantValueTest.cpp revision 8711da1b6ba7d2bb94fa579f7d58b4d3e45825ac
1f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek//===- unittest/ASTMatchers/Dynamic/VariantValueTest.cpp - VariantValue unit tests -===// 2f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek// 3f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek// The LLVM Compiler Infrastructure 4f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek// 5f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek// This file is distributed under the University of Illinois Open Source 6f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek// License. See LICENSE.TXT for details. 7f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek// 8f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek//===-----------------------------------------------------------------------------===// 9f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 10f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "../ASTMatchersTest.h" 11f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "clang/ASTMatchers/Dynamic/VariantValue.h" 12f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "gtest/gtest.h" 13f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 14f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimeknamespace clang { 15f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimeknamespace ast_matchers { 16f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimeknamespace dynamic { 17f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimeknamespace { 18f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 19f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimekusing ast_matchers::internal::DynTypedMatcher; 20f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimekusing ast_matchers::internal::Matcher; 21f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 227a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel BenzaquenTEST(VariantValueTest, Unsigned) { 237a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen const unsigned kUnsigned = 17; 247a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen VariantValue Value = kUnsigned; 257a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen 267a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen EXPECT_TRUE(Value.isUnsigned()); 277a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen EXPECT_EQ(kUnsigned, Value.getUnsigned()); 287a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen 297a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen EXPECT_FALSE(Value.isString()); 307a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen EXPECT_FALSE(Value.isMatcher()); 3176c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_FALSE(Value.hasTypedMatcher<clang::Decl>()); 3276c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_FALSE(Value.hasTypedMatcher<clang::UnaryOperator>()); 337a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen} 347a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen 35f7f295f321fd434e1e542844a71f538a56f2f8fbManuel KlimekTEST(VariantValueTest, String) { 36f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek const ::std::string kString = "string"; 37f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek VariantValue Value = kString; 38f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 39f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek EXPECT_TRUE(Value.isString()); 40f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek EXPECT_EQ(kString, Value.getString()); 4176c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_EQ("String", Value.getTypeAsString()); 42f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 437a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen EXPECT_FALSE(Value.isUnsigned()); 44f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek EXPECT_FALSE(Value.isMatcher()); 4576c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_FALSE(Value.hasTypedMatcher<clang::Decl>()); 4676c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_FALSE(Value.hasTypedMatcher<clang::UnaryOperator>()); 47f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} 48f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 49f7f295f321fd434e1e542844a71f538a56f2f8fbManuel KlimekTEST(VariantValueTest, DynTypedMatcher) { 50f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek VariantValue Value = stmt(); 51f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 527a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen EXPECT_FALSE(Value.isUnsigned()); 53f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek EXPECT_FALSE(Value.isString()); 54f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 55f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek EXPECT_TRUE(Value.isMatcher()); 5676c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_FALSE(Value.hasTypedMatcher<clang::Decl>()); 5776c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_TRUE(Value.hasTypedMatcher<clang::UnaryOperator>()); 5876c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_EQ("Matcher<Stmt>", Value.getTypeAsString()); 59f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 6076c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen // Can only convert to compatible matchers. 61f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek Value = recordDecl(); 62f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek EXPECT_TRUE(Value.isMatcher()); 6376c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_TRUE(Value.hasTypedMatcher<clang::Decl>()); 6476c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_FALSE(Value.hasTypedMatcher<clang::UnaryOperator>()); 6576c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_EQ("Matcher<Decl>", Value.getTypeAsString()); 66f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 6776c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen Value = ignoringImpCasts(expr()); 68f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek EXPECT_TRUE(Value.isMatcher()); 6976c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_FALSE(Value.hasTypedMatcher<clang::Decl>()); 7076c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_FALSE(Value.hasTypedMatcher<clang::Stmt>()); 7176c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_TRUE(Value.hasTypedMatcher<clang::Expr>()); 7276c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_TRUE(Value.hasTypedMatcher<clang::IntegerLiteral>()); 7376c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_FALSE(Value.hasTypedMatcher<clang::GotoStmt>()); 7476c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_EQ("Matcher<Expr>", Value.getTypeAsString()); 75f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} 76f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 77f7f295f321fd434e1e542844a71f538a56f2f8fbManuel KlimekTEST(VariantValueTest, Assignment) { 78f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek VariantValue Value = std::string("A"); 79f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek EXPECT_TRUE(Value.isString()); 80f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek EXPECT_EQ("A", Value.getString()); 817a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen EXPECT_FALSE(Value.isUnsigned()); 82f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek EXPECT_FALSE(Value.isMatcher()); 8376c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_EQ("String", Value.getTypeAsString()); 84f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 85f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek Value = recordDecl(); 867a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen EXPECT_FALSE(Value.isUnsigned()); 87f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek EXPECT_FALSE(Value.isString()); 88f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek EXPECT_TRUE(Value.isMatcher()); 8976c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_TRUE(Value.hasTypedMatcher<clang::Decl>()); 9076c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_FALSE(Value.hasTypedMatcher<clang::UnaryOperator>()); 9176c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_EQ("Matcher<Decl>", Value.getTypeAsString()); 92f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 937a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen Value = 17; 947a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen EXPECT_TRUE(Value.isUnsigned()); 957a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen EXPECT_EQ(17U, Value.getUnsigned()); 967a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen EXPECT_FALSE(Value.isMatcher()); 977a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen EXPECT_FALSE(Value.isString()); 987a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen 99f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek Value = VariantValue(); 1007a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen EXPECT_FALSE(Value.isUnsigned()); 101f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek EXPECT_FALSE(Value.isString()); 102f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek EXPECT_FALSE(Value.isMatcher()); 10376c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_EQ("Nothing", Value.getTypeAsString()); 104f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} 105f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 1068711da1b6ba7d2bb94fa579f7d58b4d3e45825acReid KlecknerTEST(GenericValueTest, Matcher) { 10776c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_TRUE(matches("class X {};", VariantValue(recordDecl(hasName("X"))) 10876c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen .getTypedMatcher<Decl>())); 10976c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_TRUE( 11076c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen matches("int x;", VariantValue(varDecl()).getTypedMatcher<Decl>())); 11176c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_TRUE(matches("int foo() { return 1 + 1; }", 11276c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen VariantValue(functionDecl()).getTypedMatcher<Decl>())); 11376c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen // Can't get the wrong matcher. 11476c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_FALSE(VariantValue(varDecl()).hasTypedMatcher<Stmt>()); 1158711da1b6ba7d2bb94fa579f7d58b4d3e45825acReid Kleckner#if !defined(NDEBUG) && GTEST_HAS_DEATH_TEST && !defined(_MSC_VER) 1168711da1b6ba7d2bb94fa579f7d58b4d3e45825acReid Kleckner // Trying to get the wrong matcher fails an assertion in Matcher<T>. We don't 1178711da1b6ba7d2bb94fa579f7d58b4d3e45825acReid Kleckner // do this test when building with MSVC because its debug C runtime prints the 1188711da1b6ba7d2bb94fa579f7d58b4d3e45825acReid Kleckner // assertion failure message as a wide string, which gtest doesn't understand. 11976c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_DEATH(VariantValue(varDecl()).getTypedMatcher<Stmt>(), 12076c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen "canConstructFrom"); 12176c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen#endif 122f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 123f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek EXPECT_FALSE( 12476c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen matches("int x;", VariantValue(functionDecl()).getTypedMatcher<Decl>())); 12576c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen EXPECT_FALSE(matches("int foo() { return 1 + 1; }", 12676c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen VariantValue(declRefExpr()).getTypedMatcher<Stmt>())); 127f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} 128f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 129f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} // end anonymous namespace 130f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} // end namespace dynamic 131f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} // end namespace ast_matchers 132f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} // end namespace clang 133