blob: a7ec0c071248db257120579c9a8a3d0c885ca1d6 [file] [log] [blame]
// 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