//===- unittest/AST/ASTTypeTraits.cpp - AST type traits unit tests ------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===--------------------------------------------------------------------===// #include "clang/AST/ASTTypeTraits.h" #include "MatchVerifier.h" #include "gtest/gtest.h" using namespace clang::ast_matchers; namespace clang { namespace ast_type_traits { TEST(ASTNodeKind, NoKind) { EXPECT_FALSE(ASTNodeKind().isBaseOf(ASTNodeKind())); EXPECT_FALSE(ASTNodeKind().isSame(ASTNodeKind())); } template static ASTNodeKind DNT() { return ASTNodeKind::getFromNodeKind(); } TEST(ASTNodeKind, IsNone) { EXPECT_TRUE(ASTNodeKind().isNone()); EXPECT_FALSE(DNT().isNone()); EXPECT_FALSE(DNT().isNone()); } TEST(ASTNodeKind, Bases) { EXPECT_TRUE(DNT().isBaseOf(DNT())); EXPECT_FALSE(DNT().isSame(DNT())); EXPECT_FALSE(DNT().isBaseOf(DNT())); EXPECT_TRUE(DNT().isSame(DNT())); } TEST(ASTNodeKind, BaseDistances) { unsigned Distance = 1; EXPECT_TRUE(DNT().isBaseOf(DNT(), &Distance)); EXPECT_EQ(0u, Distance); EXPECT_TRUE(DNT().isBaseOf(DNT(), &Distance)); EXPECT_EQ(1u, Distance); Distance = 3; EXPECT_TRUE(DNT().isBaseOf(DNT(), &Distance)); EXPECT_EQ(2u, Distance); } TEST(ASTNodeKind, SameBase) { EXPECT_TRUE(DNT().isBaseOf(DNT())); EXPECT_TRUE(DNT().isBaseOf(DNT())); EXPECT_FALSE(DNT().isBaseOf(DNT())); EXPECT_FALSE(DNT().isBaseOf(DNT())); } TEST(ASTNodeKind, DiffBase) { EXPECT_FALSE(DNT().isBaseOf(DNT())); EXPECT_FALSE(DNT().isBaseOf(DNT())); EXPECT_FALSE(DNT().isSame(DNT())); } TEST(ASTNodeKind, MostDerivedType) { EXPECT_TRUE(DNT().isSame( ASTNodeKind::getMostDerivedType(DNT(), DNT()))); EXPECT_TRUE(DNT().isSame( ASTNodeKind::getMostDerivedType(DNT(), DNT()))); EXPECT_TRUE(DNT().isSame( ASTNodeKind::getMostDerivedType(DNT(), DNT()))); // Not related. Returns nothing. EXPECT_TRUE( ASTNodeKind::getMostDerivedType(DNT(), DNT()).isNone()); EXPECT_TRUE(ASTNodeKind::getMostDerivedType(DNT(), DNT()).isNone()); } TEST(ASTNodeKind, MostDerivedCommonAncestor) { EXPECT_TRUE(DNT().isSame(ASTNodeKind::getMostDerivedCommonAncestor( DNT(), DNT()))); EXPECT_TRUE(DNT().isSame(ASTNodeKind::getMostDerivedCommonAncestor( DNT(), DNT()))); EXPECT_TRUE(DNT().isSame(ASTNodeKind::getMostDerivedCommonAncestor( DNT(), DNT()))); // A little related. Returns the ancestor. EXPECT_TRUE( DNT().isSame(ASTNodeKind::getMostDerivedCommonAncestor( DNT(), DNT()))); // Not related. Returns nothing. EXPECT_TRUE(ASTNodeKind::getMostDerivedCommonAncestor( DNT(), DNT()).isNone()); } struct Foo {}; TEST(ASTNodeKind, UnknownKind) { // We can construct one, but it is nowhere in the hierarchy. EXPECT_FALSE(DNT().isSame(DNT())); } TEST(ASTNodeKind, Name) { EXPECT_EQ("", ASTNodeKind().asStringRef()); #define VERIFY_NAME(Node) EXPECT_EQ(#Node, DNT().asStringRef()); VERIFY_NAME(TemplateArgument); VERIFY_NAME(NestedNameSpecifierLoc); VERIFY_NAME(QualType); VERIFY_NAME(TypeLoc); VERIFY_NAME(CXXCtorInitializer); VERIFY_NAME(NestedNameSpecifier); VERIFY_NAME(Decl); VERIFY_NAME(CXXRecordDecl); VERIFY_NAME(Stmt); VERIFY_NAME(CallExpr); VERIFY_NAME(Type); VERIFY_NAME(ConstantArrayType); #undef VERIFY_NAME } TEST(DynTypedNode, DeclSourceRange) { RangeVerifier Verifier; Verifier.expectRange(1, 1, 1, 11); EXPECT_TRUE(Verifier.match("void f() {}", decl())); } TEST(DynTypedNode, StmtSourceRange) { RangeVerifier Verifier; Verifier.expectRange(1, 10, 1, 11); EXPECT_TRUE(Verifier.match("void f() {}", stmt())); } TEST(DynTypedNode, TypeLocSourceRange) { RangeVerifier Verifier; Verifier.expectRange(1, 1, 1, 8); EXPECT_TRUE(Verifier.match("void f() {}", typeLoc(loc(functionType())))); } TEST(DynTypedNode, NNSLocSourceRange) { RangeVerifier Verifier; Verifier.expectRange(1, 33, 1, 34); EXPECT_TRUE(Verifier.match("namespace N { typedef void T; } N::T f() {}", nestedNameSpecifierLoc())); } TEST(DynTypedNode, DeclDump) { DumpVerifier Verifier; Verifier.expectSubstring("FunctionDecl"); EXPECT_TRUE(Verifier.match("void f() {}", functionDecl())); } TEST(DynTypedNode, StmtDump) { DumpVerifier Verifier; Verifier.expectSubstring("CompoundStmt"); EXPECT_TRUE(Verifier.match("void f() {}", stmt())); } TEST(DynTypedNode, DeclPrint) { PrintVerifier Verifier; Verifier.expectString("void f() {\n}\n"); EXPECT_TRUE(Verifier.match("void f() {}", functionDecl())); } TEST(DynTypedNode, StmtPrint) { PrintVerifier Verifier; Verifier.expectString("{\n}\n"); EXPECT_TRUE(Verifier.match("void f() {}", stmt())); } TEST(DynTypedNode, QualType) { QualType Q; DynTypedNode Node = DynTypedNode::create(Q); EXPECT_TRUE(Node == Node); EXPECT_FALSE(Node < Node); } } // namespace ast_type_traits } // namespace clang