Serenity Operating System
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}