| // 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 <optional> | 
 |  | 
 | #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/AST/ASTContext.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(Lifetime::Static(), ast_context.IntTy, | 
 |                              std::nullopt); | 
 |         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(Lifetime::CreateLocal(), ast_context.IntTy, std::nullopt); | 
 |         Object o2(Lifetime::CreateLocal(), ast_context.IntTy, std::nullopt); | 
 |  | 
 |         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(ObjectSet{&o1})); | 
 |         EXPECT_TRUE(ObjectSet({&o1, &o2}).Contains(ObjectSet{&o2})); | 
 |         EXPECT_TRUE(ObjectSet({&o1, &o2}).Contains({&o1, &o2})); | 
 |         EXPECT_TRUE(ObjectSet({&o1}).Contains(ObjectSet{&o1})); | 
 |         EXPECT_FALSE(ObjectSet({&o1}).Contains(ObjectSet{&o2})); | 
 |         EXPECT_TRUE(ObjectSet().Contains(ObjectSet())); | 
 |       }, | 
 |       {}); | 
 | } | 
 |  | 
 | TEST(ObjectSet, Union) { | 
 |   runOnCodeWithLifetimeHandlers( | 
 |       "", | 
 |       [](const clang::ASTContext& ast_context, | 
 |          const LifetimeAnnotationContext&) { | 
 |         Object object_static(Lifetime::Static(), ast_context.IntTy, | 
 |                              std::nullopt); | 
 |         ObjectSet set_1 = {&object_static}; | 
 |         Object object_local(Lifetime::CreateLocal(), ast_context.IntTy, | 
 |                             std::nullopt); | 
 |         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(Lifetime::CreateLocal(), ast_context.IntTy, std::nullopt); | 
 |         Object o2(Lifetime::CreateLocal(), ast_context.IntTy, std::nullopt); | 
 |         Object o3(Lifetime::CreateLocal(), ast_context.IntTy, std::nullopt); | 
 |  | 
 |         { | 
 |           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(Lifetime::Static(), ast_context.IntTy, | 
 |                              std::nullopt); | 
 |         Object object_local(Lifetime::CreateLocal(), ast_context.IntTy, | 
 |                             std::nullopt); | 
 |         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 |