blob: 8206d00b81a700047cf61a966f03250e2e0a87fa [file] [log] [blame]
Manuel Klimekf7f295f2013-05-14 09:13:00 +00001//===- 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
Samuel Benzaquen7a337af2013-06-04 15:46:22 +000022TEST(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());
Samuel Benzaquen76c2f922013-06-20 14:28:32 +000031 EXPECT_FALSE(Value.hasTypedMatcher<clang::Decl>());
32 EXPECT_FALSE(Value.hasTypedMatcher<clang::UnaryOperator>());
Samuel Benzaquen7a337af2013-06-04 15:46:22 +000033}
34
Manuel Klimekf7f295f2013-05-14 09:13:00 +000035TEST(VariantValueTest, String) {
36 const ::std::string kString = "string";
37 VariantValue Value = kString;
38
39 EXPECT_TRUE(Value.isString());
40 EXPECT_EQ(kString, Value.getString());
Samuel Benzaquen76c2f922013-06-20 14:28:32 +000041 EXPECT_EQ("String", Value.getTypeAsString());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000042
Samuel Benzaquen7a337af2013-06-04 15:46:22 +000043 EXPECT_FALSE(Value.isUnsigned());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000044 EXPECT_FALSE(Value.isMatcher());
Samuel Benzaquen76c2f922013-06-20 14:28:32 +000045 EXPECT_FALSE(Value.hasTypedMatcher<clang::Decl>());
46 EXPECT_FALSE(Value.hasTypedMatcher<clang::UnaryOperator>());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000047}
48
49TEST(VariantValueTest, DynTypedMatcher) {
50 VariantValue Value = stmt();
51
Samuel Benzaquen7a337af2013-06-04 15:46:22 +000052 EXPECT_FALSE(Value.isUnsigned());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000053 EXPECT_FALSE(Value.isString());
54
55 EXPECT_TRUE(Value.isMatcher());
Samuel Benzaquen76c2f922013-06-20 14:28:32 +000056 EXPECT_FALSE(Value.hasTypedMatcher<clang::Decl>());
57 EXPECT_TRUE(Value.hasTypedMatcher<clang::UnaryOperator>());
58 EXPECT_EQ("Matcher<Stmt>", Value.getTypeAsString());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000059
Samuel Benzaquen76c2f922013-06-20 14:28:32 +000060 // Can only convert to compatible matchers.
Manuel Klimekf7f295f2013-05-14 09:13:00 +000061 Value = recordDecl();
62 EXPECT_TRUE(Value.isMatcher());
Samuel Benzaquen76c2f922013-06-20 14:28:32 +000063 EXPECT_TRUE(Value.hasTypedMatcher<clang::Decl>());
64 EXPECT_FALSE(Value.hasTypedMatcher<clang::UnaryOperator>());
65 EXPECT_EQ("Matcher<Decl>", Value.getTypeAsString());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000066
Samuel Benzaquen76c2f922013-06-20 14:28:32 +000067 Value = ignoringImpCasts(expr());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000068 EXPECT_TRUE(Value.isMatcher());
Samuel Benzaquen76c2f922013-06-20 14:28:32 +000069 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());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000075}
76
77TEST(VariantValueTest, Assignment) {
78 VariantValue Value = std::string("A");
79 EXPECT_TRUE(Value.isString());
80 EXPECT_EQ("A", Value.getString());
Samuel Benzaquen7a337af2013-06-04 15:46:22 +000081 EXPECT_FALSE(Value.isUnsigned());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000082 EXPECT_FALSE(Value.isMatcher());
Samuel Benzaquen76c2f922013-06-20 14:28:32 +000083 EXPECT_EQ("String", Value.getTypeAsString());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000084
85 Value = recordDecl();
Samuel Benzaquen7a337af2013-06-04 15:46:22 +000086 EXPECT_FALSE(Value.isUnsigned());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000087 EXPECT_FALSE(Value.isString());
88 EXPECT_TRUE(Value.isMatcher());
Samuel Benzaquen76c2f922013-06-20 14:28:32 +000089 EXPECT_TRUE(Value.hasTypedMatcher<clang::Decl>());
90 EXPECT_FALSE(Value.hasTypedMatcher<clang::UnaryOperator>());
91 EXPECT_EQ("Matcher<Decl>", Value.getTypeAsString());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000092
Samuel Benzaquen7a337af2013-06-04 15:46:22 +000093 Value = 17;
94 EXPECT_TRUE(Value.isUnsigned());
95 EXPECT_EQ(17U, Value.getUnsigned());
96 EXPECT_FALSE(Value.isMatcher());
97 EXPECT_FALSE(Value.isString());
98
Manuel Klimekf7f295f2013-05-14 09:13:00 +000099 Value = VariantValue();
Samuel Benzaquen7a337af2013-06-04 15:46:22 +0000100 EXPECT_FALSE(Value.isUnsigned());
Manuel Klimekf7f295f2013-05-14 09:13:00 +0000101 EXPECT_FALSE(Value.isString());
102 EXPECT_FALSE(Value.isMatcher());
Samuel Benzaquen76c2f922013-06-20 14:28:32 +0000103 EXPECT_EQ("Nothing", Value.getTypeAsString());
Manuel Klimekf7f295f2013-05-14 09:13:00 +0000104}
105
106TEST(GeneicValueTest, Matcher) {
Samuel Benzaquen76c2f922013-06-20 14:28:32 +0000107 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
Manuel Klimekf7f295f2013-05-14 09:13:00 +0000120
121 EXPECT_FALSE(
Samuel Benzaquen76c2f922013-06-20 14:28:32 +0000122 matches("int x;", VariantValue(functionDecl()).getTypedMatcher<Decl>()));
123 EXPECT_FALSE(matches("int foo() { return 1 + 1; }",
124 VariantValue(declRefExpr()).getTypedMatcher<Stmt>()));
Manuel Klimekf7f295f2013-05-14 09:13:00 +0000125}
126
127} // end anonymous namespace
128} // end namespace dynamic
129} // end namespace ast_matchers
130} // end namespace clang