/*
 * Copyright (C) 2022-2025 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "config.h"
#include <wtf/CompactPtr.h>

#include "AlignedRefLogger.h"
#include "Helpers/Utilities.h"
#include <wtf/HashMap.h>
#include <wtf/MainThread.h>
#include <wtf/NeverDestroyed.h>
#include <wtf/RefCounted.h>
#include <wtf/RunLoop.h>
#include <wtf/ThreadSafeRefCounted.h>
#include <wtf/Threading.h>

namespace TestWebKitAPI {

TEST(WTF_CompactPtr, Basic)
{
    DerivedAlignedRefLogger a("a");

    CompactPtr<AlignedRefLogger> empty;
    EXPECT_EQ(nullptr, empty.get());

    {
        CompactPtr<AlignedRefLogger> ptr(&a);
        EXPECT_EQ(&a, ptr.get());
        EXPECT_EQ(&a, &*ptr);
        EXPECT_EQ(&a.name, &ptr->name);
    }

    {
#if CPU(ADDRESS64)
        // The following tests that encoding and decoding a pointer to a statically
        // allocated object (which may potentially be outsized) also works.
        // If the encoding / decoding works, then other functionality should also
        // just work.
        DerivedAlignedRefLogger* staticA = std::bit_cast<DerivedAlignedRefLogger*>(0x1234aaaa0000ull);
        DerivedAlignedRefLogger* staticB = std::bit_cast<DerivedAlignedRefLogger*>(0x1234bbbb0000ull);
#else
        static DerivedAlignedRefLogger staticALogger("staticA");
        static DerivedAlignedRefLogger staticBLogger("staticB");

        DerivedAlignedRefLogger* staticA = &staticALogger;
        DerivedAlignedRefLogger* staticB = &staticBLogger;
#endif

        CompactPtr<AlignedRefLogger> saPtr(staticA);
        CompactPtr<AlignedRefLogger> sbPtr(staticB);
        CompactPtr<AlignedRefLogger> sa2Ptr(staticA);

        EXPECT_EQ(staticA, saPtr.get());
        EXPECT_EQ(staticA, &*saPtr);

        EXPECT_EQ(staticB, sbPtr.get());
        EXPECT_EQ(staticB, &*sbPtr);

        EXPECT_EQ(staticA, sa2Ptr.get());
        EXPECT_EQ(staticA, &*sa2Ptr);
    }

    {
        CompactPtr<AlignedRefLogger> ptr = &a;
        EXPECT_EQ(&a, ptr.get());
    }

    {
        CompactPtr<AlignedRefLogger> p1 = &a;
        CompactPtr<AlignedRefLogger> p2(p1);
        EXPECT_EQ(&a, p1.get());
        EXPECT_EQ(&a, p2.get());
    }

    {
        CompactPtr<AlignedRefLogger> p1 = &a;
        CompactPtr<AlignedRefLogger> p2 = p1;
        EXPECT_EQ(&a, p1.get());
        EXPECT_EQ(&a, p2.get());
    }

    {
        CompactPtr<AlignedRefLogger> p1 = &a;
        CompactPtr<AlignedRefLogger> p2 = WTF::move(p1);
        SUPPRESS_USE_AFTER_MOVE EXPECT_EQ(nullptr, p1.get());
        EXPECT_EQ(&a, p2.get());
    }

    {
        CompactPtr<AlignedRefLogger> p1 = &a;
        CompactPtr<AlignedRefLogger> p2(WTF::move(p1));
        SUPPRESS_USE_AFTER_MOVE EXPECT_EQ(nullptr, p1.get());
        EXPECT_EQ(&a, p2.get());
    }

    {
        CompactPtr<DerivedAlignedRefLogger> p1 = &a;
        CompactPtr<AlignedRefLogger> p2 = p1;
        EXPECT_EQ(&a, p1.get());
        EXPECT_EQ(&a, p2.get());
    }

    {
        CompactPtr<DerivedAlignedRefLogger> p1 = &a;
        CompactPtr<AlignedRefLogger> p2 = WTF::move(p1);
        SUPPRESS_USE_AFTER_MOVE EXPECT_EQ(nullptr, p1.get());
        EXPECT_EQ(&a, p2.get());
    }

    {
        CompactPtr<AlignedRefLogger> ptr(&a);
        EXPECT_EQ(&a, ptr.get());
        ptr = nullptr;
        EXPECT_EQ(nullptr, ptr.get());
    }

    {
        CompactPtr<AlignedRefLogger> ptr(nullptr);
        EXPECT_EQ(nullptr, ptr.get());
        EXPECT_EQ(false, static_cast<bool>(ptr));
    }

    {
        CompactPtr<AlignedRefLogger> ptr = nullptr;
        EXPECT_EQ(nullptr, ptr.get());
        EXPECT_EQ(true, !ptr);
    }

    {
        DerivedAlignedRefLogger b("b");
        DerivedAlignedRefLogger* p1 = &a;
        CompactPtr<DerivedAlignedRefLogger> p2(&b);
        p2.swap(p1);
        EXPECT_EQ(p1, &b);
        EXPECT_EQ(p2.get(), &a);
    }
}

TEST(WTF_CompactPtr, Assignment)
{
    DerivedAlignedRefLogger a("a");
    AlignedRefLogger b("b");
    DerivedAlignedRefLogger c("c");

    {
        CompactPtr<AlignedRefLogger> p1 = &a;
        CompactPtr<AlignedRefLogger> p2 = &b;
        EXPECT_EQ(&a, p1.get());
        EXPECT_EQ(&b, p2.get());
        p1 = p2;
        EXPECT_EQ(&b, p1.get());
        EXPECT_EQ(&b, p2.get());
    }

    {
        CompactPtr<AlignedRefLogger> ptr(&a);
        EXPECT_EQ(&a, ptr.get());
        ptr = &b;
        EXPECT_EQ(&b, ptr.get());
    }

    {
        CompactPtr<AlignedRefLogger> ptr(&a);
        EXPECT_EQ(&a, ptr.get());
        ptr = nullptr;
        EXPECT_EQ(nullptr, ptr.get());
    }

    {
        CompactPtr<AlignedRefLogger> p1 = &a;
        CompactPtr<AlignedRefLogger> p2 = &b;
        EXPECT_EQ(&a, p1.get());
        EXPECT_EQ(&b, p2.get());
        p1 = WTF::move(p2);
        EXPECT_EQ(&b, p1.get());
        SUPPRESS_USE_AFTER_MOVE EXPECT_EQ(nullptr, p2.get());
    }

    {
        CompactPtr<AlignedRefLogger> p1 = &a;
        CompactPtr<DerivedAlignedRefLogger> p2 = &c;
        EXPECT_EQ(&a, p1.get());
        EXPECT_EQ(&c, p2.get());
        p1 = p2;
        EXPECT_EQ(&c, p1.get());
        EXPECT_EQ(&c, p2.get());
    }

    {
        CompactPtr<AlignedRefLogger> p1 = &a;
        CompactPtr<DerivedAlignedRefLogger> p2 = &c;
        EXPECT_EQ(&a, p1.get());
        EXPECT_EQ(&c, p2.get());
        p1 = WTF::move(p2);
        EXPECT_EQ(&c, p1.get());
        SUPPRESS_USE_AFTER_MOVE EXPECT_EQ(nullptr, p2.get());
    }

    {
        CompactPtr<AlignedRefLogger> ptr(&a);
        EXPECT_EQ(&a, ptr.get());
        ptr = &c;
        EXPECT_EQ(&c, ptr.get());
    }
}

struct alignas(16) AlignedPackingTarget {
    WTF_ALLOW_STRUCT_COMPACT_POINTERS;
    unsigned m_value { 0 };
};
TEST(WTF_CompactPtr, HashMap)
{
    Vector<AlignedPackingTarget> vector;
    HashMap<PackedPtr<AlignedPackingTarget>, unsigned> map;
    vector.reserveCapacity(10000);
    for (unsigned i = 0; i < 10000; ++i)
        vector.append(AlignedPackingTarget { i });

    for (auto& target : vector)
        map.add(&target, target.m_value);

    for (auto& target : vector) {
        EXPECT_TRUE(map.contains(&target));
        EXPECT_EQ(map.get(&target), target.m_value);
    }
}

TEST(WTF_CompactPtr, HashMapRemoveAndAdd)
{
    Vector<AlignedPackingTarget> vector;
    HashMap<PackedPtr<AlignedPackingTarget>, unsigned> map;
    vector.reserveCapacity(10000);
    for (unsigned i = 0; i < 10000; ++i)
        vector.append(AlignedPackingTarget { i });

    for (auto& target : vector)
        map.add(&target, target.m_value);

    for (unsigned i = 0; i < 4000; ++i) {
        auto& target = vector[i];
        map.remove(&target);
    }

    for (unsigned i = 0; i < 4000; ++i) {
        auto& target = vector[i];
        map.add(&target, target.m_value);
    }

    for (auto& target : vector) {
        EXPECT_TRUE(map.contains(&target));
        EXPECT_EQ(map.get(&target), target.m_value);
    }
}

TEST(WTF_CompactPtr, StringHashSet)
{
    Vector<String> vector;
    HashSet<CompactPtr<StringImpl>> set;
    vector.reserveCapacity(10000);
    for (unsigned i = 0; i < 10000; ++i)
        vector.append(String::number(i));

    for (auto& target : vector)
        set.add(target.impl());

    for (unsigned i = 0; i < 4000; ++i) {
        auto& target = vector[i];
        set.remove(target.impl());
    }

    for (unsigned i = 0; i < 4000; ++i) {
        auto& target = vector[i];
        set.add(target.impl());
    }

    for (auto& target : vector)
        set.add(target.impl());

    EXPECT_EQ(set.size(), vector.size());

    for (auto& target : vector)
        EXPECT_TRUE(set.contains(target.impl()));
}

} // namespace TestWebKitAPI
