Serenity Operating System
at master 66 lines 1.6 kB view raw
1/* 2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <LibTest/TestCase.h> 8 9#include <AK/DeprecatedString.h> 10#include <AK/WeakPtr.h> 11#include <AK/Weakable.h> 12 13#if defined(AK_COMPILER_CLANG) 14# pragma clang diagnostic push 15# pragma clang diagnostic ignored "-Wunused-private-field" 16#endif 17 18class SimpleWeakable : public Weakable<SimpleWeakable> 19 , public RefCounted<SimpleWeakable> { 20public: 21 SimpleWeakable() = default; 22 23private: 24 int m_member { 123 }; 25}; 26 27#if defined(AK_COMPILER_CLANG) 28# pragma clang diagnostic pop 29#endif 30 31TEST_CASE(basic_weak) 32{ 33 WeakPtr<SimpleWeakable> weak1; 34 WeakPtr<SimpleWeakable> weak2; 35 36 { 37 auto simple = adopt_ref(*new SimpleWeakable); 38 weak1 = simple; 39 weak2 = simple; 40 EXPECT_EQ(weak1.is_null(), false); 41 EXPECT_EQ(weak2.is_null(), false); 42 EXPECT_EQ(weak1.strong_ref().ptr(), simple.ptr()); 43 EXPECT_EQ(weak1.strong_ref().ptr(), weak2.strong_ref().ptr()); 44 } 45 46 EXPECT_EQ(weak1.is_null(), true); 47 EXPECT_EQ(weak1.strong_ref().ptr(), nullptr); 48 EXPECT_EQ(weak1.strong_ref().ptr(), weak2.strong_ref().ptr()); 49} 50 51TEST_CASE(weakptr_move) 52{ 53 WeakPtr<SimpleWeakable> weak1; 54 WeakPtr<SimpleWeakable> weak2; 55 56 { 57 auto simple = adopt_ref(*new SimpleWeakable); 58 weak1 = simple; 59 weak2 = move(weak1); 60 EXPECT_EQ(weak1.is_null(), true); 61 EXPECT_EQ(weak2.is_null(), false); 62 EXPECT_EQ(weak2.strong_ref().ptr(), simple.ptr()); 63 } 64 65 EXPECT_EQ(weak2.is_null(), true); 66}