//===--- ThreadSafeRefCntPointerTest.cpp ----------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// #include "swift/Basic/ThreadSafeRefCounted.h" #include "llvm/ADT/IntrusiveRefCntPtr.h" #include "gtest/gtest.h" using llvm::IntrusiveRefCntPtr; struct TestRelease : llvm::ThreadSafeRefCountedBase { bool &destroy; TestRelease(bool &destroy) : destroy(destroy) {} ~TestRelease() { destroy = true; } }; TEST(ThreadSafeRefCountedBase, ReleaseSimple) { bool destroyed = false; { IntrusiveRefCntPtr ref = new TestRelease(destroyed); } EXPECT_TRUE(destroyed); } TEST(ThreadSafeRefCountedBase, Release) { bool destroyed = false; { IntrusiveRefCntPtr ref = new TestRelease(destroyed); ref->Retain(); ref->Release(); } EXPECT_TRUE(destroyed); } struct TestReleaseVPTR : swift::ThreadSafeRefCountedBaseVPTR { bool &destroy; TestReleaseVPTR(bool &destroy) : destroy(destroy) {} ~TestReleaseVPTR() override { destroy = true; } }; TEST(ThreadSafeRefCountedBaseVPTR, ReleaseSimple) { bool destroyed = false; { IntrusiveRefCntPtr ref = new TestReleaseVPTR(destroyed); } EXPECT_TRUE(destroyed); } TEST(ThreadSafeRefCountedBaseVPTR, Release) { bool destroyed = false; { IntrusiveRefCntPtr ref = new TestReleaseVPTR(destroyed); ref->Retain(); ref->Release(); } EXPECT_TRUE(destroyed); }