blob: e62a4645f7581d93a96a30786a804f6fa1a02a24 [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());
Samuel Benzaquen9d028072013-08-13 14:54:51 +000030 EXPECT_FALSE(Value.isMatcher());
Samuel Benzaquen7a337af2013-06-04 15:46:22 +000031}
32
Manuel Klimekf7f295f2013-05-14 09:13:00 +000033TEST(VariantValueTest, String) {
34 const ::std::string kString = "string";
35 VariantValue Value = kString;
36
37 EXPECT_TRUE(Value.isString());
38 EXPECT_EQ(kString, Value.getString());
Samuel Benzaquen76c2f922013-06-20 14:28:32 +000039 EXPECT_EQ("String", Value.getTypeAsString());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000040
Samuel Benzaquen7a337af2013-06-04 15:46:22 +000041 EXPECT_FALSE(Value.isUnsigned());
Samuel Benzaquen9d028072013-08-13 14:54:51 +000042 EXPECT_FALSE(Value.isMatcher());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000043}
44
45TEST(VariantValueTest, DynTypedMatcher) {
Samuel Benzaquen9d028072013-08-13 14:54:51 +000046 VariantValue Value = VariantMatcher::SingleMatcher(stmt());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000047
Samuel Benzaquen7a337af2013-06-04 15:46:22 +000048 EXPECT_FALSE(Value.isUnsigned());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000049 EXPECT_FALSE(Value.isString());
50
Samuel Benzaquen9d028072013-08-13 14:54:51 +000051 EXPECT_TRUE(Value.isMatcher());
Samuel Benzaquen4e899d92013-08-30 15:09:52 +000052 EXPECT_FALSE(Value.getMatcher().hasTypedMatcher<Decl>());
53 EXPECT_TRUE(Value.getMatcher().hasTypedMatcher<UnaryOperator>());
Samuel Benzaquen76c2f922013-06-20 14:28:32 +000054 EXPECT_EQ("Matcher<Stmt>", Value.getTypeAsString());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000055
Samuel Benzaquen76c2f922013-06-20 14:28:32 +000056 // Can only convert to compatible matchers.
Samuel Benzaquen9d028072013-08-13 14:54:51 +000057 Value = VariantMatcher::SingleMatcher(recordDecl());
58 EXPECT_TRUE(Value.isMatcher());
Samuel Benzaquen4e899d92013-08-30 15:09:52 +000059 EXPECT_TRUE(Value.getMatcher().hasTypedMatcher<Decl>());
60 EXPECT_FALSE(Value.getMatcher().hasTypedMatcher<UnaryOperator>());
Samuel Benzaquen76c2f922013-06-20 14:28:32 +000061 EXPECT_EQ("Matcher<Decl>", Value.getTypeAsString());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000062
Samuel Benzaquen9d028072013-08-13 14:54:51 +000063 Value = VariantMatcher::SingleMatcher(ignoringImpCasts(expr()));
64 EXPECT_TRUE(Value.isMatcher());
Samuel Benzaquen4e899d92013-08-30 15:09:52 +000065 EXPECT_FALSE(Value.getMatcher().hasTypedMatcher<Decl>());
66 EXPECT_FALSE(Value.getMatcher().hasTypedMatcher<Stmt>());
67 EXPECT_TRUE(Value.getMatcher().hasTypedMatcher<Expr>());
68 EXPECT_TRUE(Value.getMatcher().hasTypedMatcher<IntegerLiteral>());
69 EXPECT_FALSE(Value.getMatcher().hasTypedMatcher<GotoStmt>());
Samuel Benzaquen76c2f922013-06-20 14:28:32 +000070 EXPECT_EQ("Matcher<Expr>", Value.getTypeAsString());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000071}
72
73TEST(VariantValueTest, Assignment) {
74 VariantValue Value = std::string("A");
75 EXPECT_TRUE(Value.isString());
76 EXPECT_EQ("A", Value.getString());
Samuel Benzaquen7a337af2013-06-04 15:46:22 +000077 EXPECT_FALSE(Value.isUnsigned());
Samuel Benzaquen9d028072013-08-13 14:54:51 +000078 EXPECT_FALSE(Value.isMatcher());
Samuel Benzaquen76c2f922013-06-20 14:28:32 +000079 EXPECT_EQ("String", Value.getTypeAsString());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000080
Samuel Benzaquen9d028072013-08-13 14:54:51 +000081 Value = VariantMatcher::SingleMatcher(recordDecl());
Samuel Benzaquen7a337af2013-06-04 15:46:22 +000082 EXPECT_FALSE(Value.isUnsigned());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000083 EXPECT_FALSE(Value.isString());
Samuel Benzaquen9d028072013-08-13 14:54:51 +000084 EXPECT_TRUE(Value.isMatcher());
Samuel Benzaquen4e899d92013-08-30 15:09:52 +000085 EXPECT_TRUE(Value.getMatcher().hasTypedMatcher<Decl>());
86 EXPECT_FALSE(Value.getMatcher().hasTypedMatcher<UnaryOperator>());
Samuel Benzaquen76c2f922013-06-20 14:28:32 +000087 EXPECT_EQ("Matcher<Decl>", Value.getTypeAsString());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000088
Samuel Benzaquen7a337af2013-06-04 15:46:22 +000089 Value = 17;
90 EXPECT_TRUE(Value.isUnsigned());
91 EXPECT_EQ(17U, Value.getUnsigned());
Samuel Benzaquen9d028072013-08-13 14:54:51 +000092 EXPECT_FALSE(Value.isMatcher());
Samuel Benzaquen7a337af2013-06-04 15:46:22 +000093 EXPECT_FALSE(Value.isString());
94
Manuel Klimekf7f295f2013-05-14 09:13:00 +000095 Value = VariantValue();
Samuel Benzaquen7a337af2013-06-04 15:46:22 +000096 EXPECT_FALSE(Value.isUnsigned());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000097 EXPECT_FALSE(Value.isString());
Samuel Benzaquen9d028072013-08-13 14:54:51 +000098 EXPECT_FALSE(Value.isMatcher());
Samuel Benzaquen76c2f922013-06-20 14:28:32 +000099 EXPECT_EQ("Nothing", Value.getTypeAsString());
Manuel Klimekf7f295f2013-05-14 09:13:00 +0000100}
101
Samuel Benzaquenef7eb022013-06-21 15:51:31 +0000102TEST(VariantValueTest, Matcher) {
Samuel Benzaquen9d028072013-08-13 14:54:51 +0000103 EXPECT_TRUE(matches("class X {};", VariantValue(VariantMatcher::SingleMatcher(
104 recordDecl(hasName("X"))))
Samuel Benzaquen4e899d92013-08-30 15:09:52 +0000105 .getMatcher()
Samuel Benzaquen76c2f922013-06-20 14:28:32 +0000106 .getTypedMatcher<Decl>()));
Samuel Benzaquen4e899d92013-08-30 15:09:52 +0000107 EXPECT_TRUE(
108 matches("int x;", VariantValue(VariantMatcher::SingleMatcher(varDecl()))
109 .getMatcher()
110 .getTypedMatcher<Decl>()));
Samuel Benzaquen76c2f922013-06-20 14:28:32 +0000111 EXPECT_TRUE(
Samuel Benzaquen9d028072013-08-13 14:54:51 +0000112 matches("int foo() { return 1 + 1; }",
113 VariantValue(VariantMatcher::SingleMatcher(functionDecl()))
Samuel Benzaquen4e899d92013-08-30 15:09:52 +0000114 .getMatcher()
Samuel Benzaquen9d028072013-08-13 14:54:51 +0000115 .getTypedMatcher<Decl>()));
Samuel Benzaquen76c2f922013-06-20 14:28:32 +0000116 // Can't get the wrong matcher.
Samuel Benzaquen9d028072013-08-13 14:54:51 +0000117 EXPECT_FALSE(VariantValue(VariantMatcher::SingleMatcher(varDecl()))
Samuel Benzaquen4e899d92013-08-30 15:09:52 +0000118 .getMatcher()
Samuel Benzaquen9d028072013-08-13 14:54:51 +0000119 .hasTypedMatcher<Stmt>());
Stephen Hines651f13c2014-04-23 16:59:28 -0700120#if !defined(NDEBUG) && GTEST_HAS_DEATH_TEST
Reid Kleckner8711da12013-06-21 12:58:12 +0000121 // Trying to get the wrong matcher fails an assertion in Matcher<T>. We don't
122 // do this test when building with MSVC because its debug C runtime prints the
123 // assertion failure message as a wide string, which gtest doesn't understand.
Samuel Benzaquen9d028072013-08-13 14:54:51 +0000124 EXPECT_DEATH(VariantValue(VariantMatcher::SingleMatcher(varDecl()))
Samuel Benzaquen4e899d92013-08-30 15:09:52 +0000125 .getMatcher()
Samuel Benzaquen9d028072013-08-13 14:54:51 +0000126 .getTypedMatcher<Stmt>(),
Samuel Benzaquenef7eb022013-06-21 15:51:31 +0000127 "hasTypedMatcher");
Samuel Benzaquen76c2f922013-06-20 14:28:32 +0000128#endif
Manuel Klimekf7f295f2013-05-14 09:13:00 +0000129
Samuel Benzaquen9d028072013-08-13 14:54:51 +0000130 EXPECT_FALSE(matches(
131 "int x;", VariantValue(VariantMatcher::SingleMatcher(functionDecl()))
Samuel Benzaquen4e899d92013-08-30 15:09:52 +0000132 .getMatcher()
Samuel Benzaquen9d028072013-08-13 14:54:51 +0000133 .getTypedMatcher<Decl>()));
Samuel Benzaquenef7eb022013-06-21 15:51:31 +0000134 EXPECT_FALSE(
135 matches("int foo() { return 1 + 1; }",
Samuel Benzaquen9d028072013-08-13 14:54:51 +0000136 VariantValue(VariantMatcher::SingleMatcher(declRefExpr()))
Samuel Benzaquen4e899d92013-08-30 15:09:52 +0000137 .getMatcher()
Samuel Benzaquen9d028072013-08-13 14:54:51 +0000138 .getTypedMatcher<Stmt>()));
Manuel Klimekf7f295f2013-05-14 09:13:00 +0000139}
140
141} // end anonymous namespace
142} // end namespace dynamic
143} // end namespace ast_matchers
144} // end namespace clang