// Copyright 2020 The Dawn Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "tests/DawnTest.h"

#include "dawn_native/metal/DeviceMTL.h"

using namespace dawn::native::metal;

class MetalAutoreleasePoolTests : public DawnTest {
  private:
    void SetUp() override {
        DawnTest::SetUp();
        DAWN_TEST_UNSUPPORTED_IF(UsesWire());

        mMtlDevice = reinterpret_cast<Device*>(device.Get());
    }

  protected:
    Device* mMtlDevice = nullptr;
};

// Test that the MTLCommandBuffer owned by the pending command context can
// outlive an autoreleasepool block.
TEST_P(MetalAutoreleasePoolTests, CommandBufferOutlivesAutorelease) {
    @autoreleasepool {
        // Get the recording context which will allocate a MTLCommandBuffer.
        // It will get autoreleased at the end of this block.
        mMtlDevice->GetPendingCommandContext();
    }

    // Submitting the command buffer should succeed.
    ASSERT_TRUE(mMtlDevice->SubmitPendingCommandBuffer().IsSuccess());
}

// Test that the MTLBlitCommandEncoder owned by the pending command context
// can outlive an autoreleasepool block.
TEST_P(MetalAutoreleasePoolTests, EncoderOutlivesAutorelease) {
    @autoreleasepool {
        // Get the recording context which will allocate a MTLCommandBuffer.
        // Begin a blit encoder.
        // Both will get autoreleased at the end of this block.
        mMtlDevice->GetPendingCommandContext()->EnsureBlit();
    }

    // Submitting the command buffer should succeed.
    mMtlDevice->GetPendingCommandContext()->EndBlit();
    ASSERT_TRUE(mMtlDevice->SubmitPendingCommandBuffer().IsSuccess());
}

DAWN_INSTANTIATE_TEST(MetalAutoreleasePoolTests, MetalBackend());
