brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.9 KiB · 2449a29 Raw
210 lines · cpp
1//===- VariantValueTest.cpp - VariantValue unit tests ---------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "../ASTMatchersTest.h"10#include "clang/ASTMatchers/Dynamic/VariantValue.h"11#include "gtest/gtest.h"12 13namespace clang {14namespace ast_matchers {15namespace dynamic {16namespace {17 18TEST(VariantValueTest, Unsigned) {19  const unsigned kUnsigned = 17;20  VariantValue Value = kUnsigned;21 22  EXPECT_TRUE(Value.isUnsigned());23  EXPECT_EQ(kUnsigned, Value.getUnsigned());24 25  EXPECT_TRUE(Value.hasValue());26  EXPECT_FALSE(Value.isString());27  EXPECT_FALSE(Value.isMatcher());28}29 30TEST(VariantValueTest, String) {31  const StringRef kString = "string";32  VariantValue Value = kString;33 34  EXPECT_TRUE(Value.isString());35  EXPECT_EQ(kString, Value.getString());36  EXPECT_EQ("String", Value.getTypeAsString());37 38  EXPECT_TRUE(Value.hasValue());39  EXPECT_FALSE(Value.isUnsigned());40  EXPECT_FALSE(Value.isMatcher());41}42 43TEST(VariantValueTest, DynTypedMatcher) {44  VariantValue Value = VariantMatcher::SingleMatcher(stmt());45 46  EXPECT_TRUE(Value.hasValue());47  EXPECT_FALSE(Value.isUnsigned());48  EXPECT_FALSE(Value.isString());49 50  EXPECT_TRUE(Value.isMatcher());51  EXPECT_FALSE(Value.getMatcher().hasTypedMatcher<Decl>());52  EXPECT_TRUE(Value.getMatcher().hasTypedMatcher<UnaryOperator>());53  EXPECT_EQ("Matcher<Stmt>", Value.getTypeAsString());54 55  // Can only convert to compatible matchers.56  Value = VariantMatcher::SingleMatcher(recordDecl());57  EXPECT_TRUE(Value.isMatcher());58  EXPECT_TRUE(Value.getMatcher().hasTypedMatcher<Decl>());59  EXPECT_FALSE(Value.getMatcher().hasTypedMatcher<UnaryOperator>());60  EXPECT_EQ("Matcher<Decl>", Value.getTypeAsString());61 62  Value = VariantMatcher::SingleMatcher(ignoringImpCasts(expr()));63  EXPECT_TRUE(Value.isMatcher());64  EXPECT_FALSE(Value.getMatcher().hasTypedMatcher<Decl>());65  EXPECT_FALSE(Value.getMatcher().hasTypedMatcher<Stmt>());66  EXPECT_TRUE(Value.getMatcher().hasTypedMatcher<Expr>());67  EXPECT_TRUE(Value.getMatcher().hasTypedMatcher<IntegerLiteral>());68  EXPECT_FALSE(Value.getMatcher().hasTypedMatcher<GotoStmt>());69  EXPECT_EQ("Matcher<Expr>", Value.getTypeAsString());70}71 72TEST(VariantValueTest, Assignment) {73  VariantValue Value = StringRef("A");74  EXPECT_TRUE(Value.isString());75  EXPECT_EQ("A", Value.getString());76  EXPECT_TRUE(Value.hasValue());77  EXPECT_FALSE(Value.isBoolean());78  EXPECT_FALSE(Value.isDouble());79  EXPECT_FALSE(Value.isUnsigned());80  EXPECT_FALSE(Value.isMatcher());81  EXPECT_EQ("String", Value.getTypeAsString());82 83  Value = VariantMatcher::SingleMatcher(recordDecl());84  EXPECT_TRUE(Value.hasValue());85  EXPECT_FALSE(Value.isBoolean());86  EXPECT_FALSE(Value.isDouble());87  EXPECT_FALSE(Value.isUnsigned());88  EXPECT_FALSE(Value.isString());89  EXPECT_TRUE(Value.isMatcher());90  EXPECT_TRUE(Value.getMatcher().hasTypedMatcher<Decl>());91  EXPECT_FALSE(Value.getMatcher().hasTypedMatcher<UnaryOperator>());92  EXPECT_EQ("Matcher<Decl>", Value.getTypeAsString());93 94  Value = true;95  EXPECT_TRUE(Value.isBoolean());96  EXPECT_EQ(true, Value.getBoolean());97  EXPECT_TRUE(Value.hasValue());98  EXPECT_FALSE(Value.isUnsigned());99  EXPECT_FALSE(Value.isMatcher());100  EXPECT_FALSE(Value.isString());101 102  Value = 3.14;103  EXPECT_TRUE(Value.isDouble());104  EXPECT_EQ(3.14, Value.getDouble());105  EXPECT_TRUE(Value.hasValue());106  EXPECT_FALSE(Value.isBoolean());107  EXPECT_FALSE(Value.isUnsigned());108  EXPECT_FALSE(Value.isMatcher());109  EXPECT_FALSE(Value.isString());110 111  Value = 17;112  EXPECT_TRUE(Value.isUnsigned());113  EXPECT_EQ(17U, Value.getUnsigned());114  EXPECT_FALSE(Value.isBoolean());115  EXPECT_FALSE(Value.isDouble());116  EXPECT_TRUE(Value.hasValue());117  EXPECT_FALSE(Value.isMatcher());118  EXPECT_FALSE(Value.isString());119 120  Value = VariantValue();121  EXPECT_FALSE(Value.hasValue());122  EXPECT_FALSE(Value.isBoolean());123  EXPECT_FALSE(Value.isDouble());124  EXPECT_FALSE(Value.isUnsigned());125  EXPECT_FALSE(Value.isString());126  EXPECT_FALSE(Value.isMatcher());127  EXPECT_EQ("Nothing", Value.getTypeAsString());128}129 130TEST(VariantValueTest, ImplicitBool) {131  VariantValue Value;132  bool IfTrue = false;133  if (Value) {134    IfTrue = true;135  }136  EXPECT_FALSE(IfTrue);137  EXPECT_TRUE(!Value);138 139  Value = StringRef();140  IfTrue = false;141  if (Value) {142    IfTrue = true;143  }144  EXPECT_TRUE(IfTrue);145  EXPECT_FALSE(!Value);146}147 148TEST(VariantValueTest, Matcher) {149  EXPECT_TRUE(matches("class X {};", VariantValue(VariantMatcher::SingleMatcher(150                                                      recordDecl(hasName("X"))))151                                         .getMatcher()152                                         .getTypedMatcher<Decl>()));153  EXPECT_TRUE(154      matches("int x;", VariantValue(VariantMatcher::SingleMatcher(varDecl()))155                            .getMatcher()156                            .getTypedMatcher<Decl>()));157  EXPECT_TRUE(158      matches("int foo() { return 1 + 1; }",159              VariantValue(VariantMatcher::SingleMatcher(functionDecl()))160                  .getMatcher()161                  .getTypedMatcher<Decl>()));162  // Can't get the wrong matcher.163  EXPECT_FALSE(VariantValue(VariantMatcher::SingleMatcher(varDecl()))164                   .getMatcher()165                   .hasTypedMatcher<Stmt>());166#if !defined(NDEBUG) && GTEST_HAS_DEATH_TEST167  // Trying to get the wrong matcher fails an assertion in Matcher<T>.  We don't168  // do this test when building with MSVC because its debug C runtime prints the169  // assertion failure message as a wide string, which gtest doesn't understand.170  EXPECT_DEATH(VariantValue(VariantMatcher::SingleMatcher(varDecl()))171                   .getMatcher()172                   .getTypedMatcher<Stmt>(),173               "hasTypedMatcher");174#endif175 176  EXPECT_FALSE(matches(177      "int x;", VariantValue(VariantMatcher::SingleMatcher(functionDecl()))178                    .getMatcher()179                    .getTypedMatcher<Decl>()));180  EXPECT_FALSE(181      matches("int foo() { return 1 + 1; }",182              VariantValue(VariantMatcher::SingleMatcher(declRefExpr()))183                  .getMatcher()184                  .getTypedMatcher<Stmt>()));185}186 187TEST(VariantValueTest, NodeKind) {188  VariantValue Value = ASTNodeKind::getFromNodeKind<Stmt>();189  EXPECT_TRUE(Value.isNodeKind());190  EXPECT_TRUE(Value.getNodeKind().isSame(ASTNodeKind::getFromNodeKind<Stmt>()));191 192  Value = ASTNodeKind::getFromNodeKind<CXXMethodDecl>();193  EXPECT_TRUE(Value.isNodeKind());194  EXPECT_TRUE(Value.getNodeKind().isSame(195      ASTNodeKind::getFromNodeKind<CXXMethodDecl>()));196 197  Value.setNodeKind(ASTNodeKind::getFromNodeKind<PointerType>());198  EXPECT_TRUE(Value.isNodeKind());199  EXPECT_TRUE(200      Value.getNodeKind().isSame(ASTNodeKind::getFromNodeKind<PointerType>()));201 202  Value = 42;203  EXPECT_TRUE(!Value.isNodeKind());204}205 206} // end anonymous namespace207} // end namespace dynamic208} // end namespace ast_matchers209} // end namespace clang210