blob: 46230e7ebd4a69538c89610077b9b617a6efde3d [file] [log] [blame]
// Copyright 2017 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "core/fxcrt/cfx_unowned_ptr.h"
#include <utility>
#include <vector>
#include "testing/gtest/include/gtest/gtest.h"
namespace {
class Clink {
public:
CFX_UnownedPtr<Clink> next_ = nullptr;
};
void DeleteDangling() {
Clink* ptr1 = new Clink();
Clink* ptr2 = new Clink();
ptr2->next_ = ptr1;
delete ptr1;
delete ptr2;
}
void AssignDangling() {
Clink* ptr1 = new Clink();
Clink* ptr2 = new Clink();
ptr2->next_ = ptr1;
delete ptr1;
ptr2->next_ = nullptr;
delete ptr2;
}
void ReleaseDangling() {
Clink* ptr1 = new Clink();
Clink* ptr2 = new Clink();
ptr2->next_ = ptr1;
delete ptr1;
ptr2->next_.Release();
delete ptr2;
}
} // namespace
TEST(fxcrt, UnownedPtrOk) {
Clink* ptr1 = new Clink();
Clink* ptr2 = new Clink();
ptr2->next_ = ptr1;
delete ptr2;
delete ptr1;
}
TEST(fxcrt, UnownedPtrNotOk) {
#if defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
EXPECT_DEATH(DeleteDangling(), "");
#else
DeleteDangling();
#endif
}
TEST(fxcrt, UnownedAssignOk) {
Clink* ptr1 = new Clink();
Clink* ptr2 = new Clink();
ptr2->next_ = ptr1;
ptr2->next_ = nullptr;
delete ptr2;
delete ptr1;
}
TEST(fxcrt, UnownedAssignNotOk) {
#if defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
EXPECT_DEATH(AssignDangling(), "");
#else
AssignDangling();
#endif
}
TEST(fxcrt, UnownedReleaseOk) {
Clink* ptr1 = new Clink();
Clink* ptr2 = new Clink();
ptr2->next_ = ptr1;
ptr2->next_.Release();
delete ptr1;
delete ptr2;
}
TEST(fxcrt, UnownedReleaseNotOk) {
#if defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
EXPECT_DEATH(ReleaseDangling(), "");
#else
ReleaseDangling();
#endif
}
TEST(fxcrt, UnownedOperatorEQ) {
int foo;
CFX_UnownedPtr<int> ptr1;
EXPECT_TRUE(ptr1 == ptr1);
CFX_UnownedPtr<int> ptr2;
EXPECT_TRUE(ptr1 == ptr2);
CFX_UnownedPtr<int> ptr3(&foo);
EXPECT_TRUE(&foo == ptr3);
EXPECT_TRUE(ptr3 == &foo);
EXPECT_FALSE(ptr1 == ptr3);
ptr1 = &foo;
EXPECT_TRUE(ptr1 == ptr3);
}
TEST(fxcrt, UnownedOperatorNE) {
int foo;
CFX_UnownedPtr<int> ptr1;
EXPECT_FALSE(ptr1 != ptr1);
CFX_UnownedPtr<int> ptr2;
EXPECT_FALSE(ptr1 != ptr2);
CFX_UnownedPtr<int> ptr3(&foo);
EXPECT_FALSE(&foo != ptr3);
EXPECT_FALSE(ptr3 != &foo);
EXPECT_TRUE(ptr1 != ptr3);
ptr1 = &foo;
EXPECT_FALSE(ptr1 != ptr3);
}
TEST(fxcrt, UnownedOperatorLT) {
int foos[2];
CFX_UnownedPtr<int> ptr1(&foos[0]);
CFX_UnownedPtr<int> ptr2(&foos[1]);
EXPECT_FALSE(ptr1 < ptr1);
EXPECT_TRUE(ptr1 < ptr2);
EXPECT_FALSE(ptr2 < ptr1);
}