blob: 2aa0e425ca8e7ce1720742c0d90e1f41ca5ab6c1 [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());
31 EXPECT_FALSE(Value.isTypedMatcher<clang::Decl>());
32 EXPECT_FALSE(Value.isTypedMatcher<clang::UnaryOperator>());
33}
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());
41
Samuel Benzaquen7a337af2013-06-04 15:46:22 +000042 EXPECT_FALSE(Value.isUnsigned());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000043 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
Samuel Benzaquen7a337af2013-06-04 15:46:22 +000051 EXPECT_FALSE(Value.isUnsigned());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000052 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());
Samuel Benzaquen7a337af2013-06-04 15:46:22 +000077 EXPECT_FALSE(Value.isUnsigned());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000078 EXPECT_FALSE(Value.isMatcher());
79
80 Value = recordDecl();
Samuel Benzaquen7a337af2013-06-04 15:46:22 +000081 EXPECT_FALSE(Value.isUnsigned());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000082 EXPECT_FALSE(Value.isString());
83 EXPECT_TRUE(Value.isMatcher());
84 EXPECT_TRUE(Value.isTypedMatcher<clang::Decl>());
85 EXPECT_TRUE(Value.isTypedMatcher<clang::UnaryOperator>());
86
Samuel Benzaquen7a337af2013-06-04 15:46:22 +000087 Value = 17;
88 EXPECT_TRUE(Value.isUnsigned());
89 EXPECT_EQ(17U, Value.getUnsigned());
90 EXPECT_FALSE(Value.isMatcher());
91 EXPECT_FALSE(Value.isString());
92
Manuel Klimekf7f295f2013-05-14 09:13:00 +000093 Value = VariantValue();
Samuel Benzaquen7a337af2013-06-04 15:46:22 +000094 EXPECT_FALSE(Value.isUnsigned());
Manuel Klimekf7f295f2013-05-14 09:13:00 +000095 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