#include <luna/SharedPtr.h>
#include <test.h>

class SampleClass : public Shareable
{
  public:
    SampleClass(int* ptr, int value) : m_ptr(ptr), m_value(value)
    {
    }

    ~SampleClass()
    {
        if (m_ptr) *m_ptr = m_value;
    }

  private:
    int* m_ptr;
    int m_value;
};

TestResult test_shared_ptr_destroyed_on_scope_exit()
{
    static int value = 0;

    {
        SharedPtr<SampleClass> sample = TRY(make_shared<SampleClass>(&value, 1));
    }

    validate(value == 1);

    test_success;
}

TestResult test_shared_ptr_preserved_if_at_least_one_copy_exists()
{
    static int value = 0;
    static SharedPtr<SampleClass> ptr = {};

    {
        SharedPtr<SampleClass> sample = TRY(make_shared<SampleClass>(&value, 1));
        ptr = sample;
    }

    validate(value == 0);

    ptr = {};

    validate(value == 1);

    test_success;
}

Result<void> test_main()
{
    test_prelude;

    run_test(test_shared_ptr_destroyed_on_scope_exit);
    run_test(test_shared_ptr_preserved_if_at_least_one_copy_exists);

    return {};
}