| // Part of the Crubit project, under the Apache License v2.0 with LLVM |
| // Exceptions. See /LICENSE for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| |
| #include "lifetime_analysis/object_set.h" |
| |
| #include "gmock/gmock.h" |
| #include "gtest/gtest.h" |
| #include "lifetime_analysis/object.h" |
| #include "lifetime_annotations/lifetime.h" |
| #include "lifetime_annotations/lifetime_annotations.h" |
| #include "lifetime_annotations/test/run_on_code.h" |
| #include "clang/Analysis/FlowSensitive/DataflowAnalysis.h" |
| |
| namespace clang { |
| namespace tidy { |
| namespace lifetimes { |
| namespace { |
| |
| using testing::UnorderedElementsAre; |
| |
| TEST(ObjectSet, AccessObjects) { |
| runOnCodeWithLifetimeHandlers( |
| "", |
| [](const clang::ASTContext& ast_context, |
| const LifetimeAnnotationContext&) { |
| Object object_static = |
| Object::Create(Lifetime::Static(), ast_context.IntTy); |
| ObjectSet object_set = {object_static}; |
| |
| EXPECT_THAT(object_set, UnorderedElementsAre(object_static)); |
| }, |
| {}); |
| } |
| |
| TEST(ObjectSet, Contains) { |
| runOnCodeWithLifetimeHandlers( |
| "", |
| [](const clang::ASTContext& ast_context, |
| const LifetimeAnnotationContext&) { |
| Object o1 = Object::Create(Lifetime::CreateLocal(), ast_context.IntTy); |
| Object o2 = Object::Create(Lifetime::CreateLocal(), ast_context.IntTy); |
| |
| EXPECT_TRUE(ObjectSet({o1, o2}).Contains(o1)); |
| EXPECT_TRUE(ObjectSet({o1, o2}).Contains(o2)); |
| EXPECT_FALSE(ObjectSet({o1}).Contains(o2)); |
| |
| EXPECT_TRUE(ObjectSet({o1, o2}).Contains(ObjectSet())); |
| EXPECT_TRUE(ObjectSet({o1, o2}).Contains({o1})); |
| EXPECT_TRUE(ObjectSet({o1, o2}).Contains({o2})); |
| EXPECT_TRUE(ObjectSet({o1, o2}).Contains({o1, o2})); |
| EXPECT_TRUE(ObjectSet({o1}).Contains({o1})); |
| EXPECT_FALSE(ObjectSet({o1}).Contains({o2})); |
| EXPECT_TRUE(ObjectSet().Contains(ObjectSet())); |
| }, |
| {}); |
| } |
| |
| TEST(ObjectSet, Union) { |
| runOnCodeWithLifetimeHandlers( |
| "", |
| [](const clang::ASTContext& ast_context, |
| const LifetimeAnnotationContext&) { |
| Object object_static = |
| Object::Create(Lifetime::Static(), ast_context.IntTy); |
| ObjectSet set_1 = {object_static}; |
| Object object_local = |
| Object::Create(Lifetime::CreateLocal(), ast_context.IntTy); |
| ObjectSet set_2 = {object_local}; |
| |
| ObjectSet set_union = set_1.Union(set_2); |
| |
| EXPECT_THAT(set_union, |
| UnorderedElementsAre(object_static, object_local)); |
| }, |
| {}); |
| } |
| |
| TEST(ObjectSet, Add) { |
| runOnCodeWithLifetimeHandlers( |
| "", |
| [](const clang::ASTContext& ast_context, |
| const LifetimeAnnotationContext&) { |
| Object o1 = Object::Create(Lifetime::CreateLocal(), ast_context.IntTy); |
| Object o2 = Object::Create(Lifetime::CreateLocal(), ast_context.IntTy); |
| Object o3 = Object::Create(Lifetime::CreateLocal(), ast_context.IntTy); |
| |
| { |
| ObjectSet object_set = {o1}; |
| object_set.Add(o2); |
| EXPECT_THAT(object_set, UnorderedElementsAre(o1, o2)); |
| } |
| { |
| ObjectSet object_set = {o1, o2}; |
| object_set.Add(o2); |
| EXPECT_THAT(object_set, UnorderedElementsAre(o1, o2)); |
| } |
| { |
| ObjectSet object_set = {o1}; |
| object_set.Add({o2, o3}); |
| EXPECT_THAT(object_set, UnorderedElementsAre(o1, o2, o3)); |
| } |
| { |
| ObjectSet object_set = {o1, o2}; |
| object_set.Add({o2, o3}); |
| EXPECT_THAT(object_set, UnorderedElementsAre(o1, o2, o3)); |
| } |
| }, |
| {}); |
| } |
| |
| TEST(ObjectSet, Equality) { |
| runOnCodeWithLifetimeHandlers( |
| "", |
| [](const clang::ASTContext& ast_context, |
| const LifetimeAnnotationContext&) { |
| Object object_static = |
| Object::Create(Lifetime::Static(), ast_context.IntTy); |
| Object object_local = |
| Object::Create(Lifetime::CreateLocal(), ast_context.IntTy); |
| ObjectSet set_1 = {object_static}; |
| ObjectSet set_2 = {object_static}; |
| ObjectSet set_3 = {object_static, object_local}; |
| |
| EXPECT_EQ(set_1, set_2); |
| EXPECT_NE(set_1, set_3); |
| }, |
| {}); |
| } |
| |
| } // namespace |
| } // namespace lifetimes |
| } // namespace tidy |
| } // namespace clang |