// Copyright 2017 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.

#ifndef TESTS_UNITTESTS_VALIDATIONTEST_H_
#define TESTS_UNITTESTS_VALIDATIONTEST_H_

#include "gtest/gtest.h"
#include "dawn/dawncpp.h"

namespace dawn_native {
    class Instance;
}

#define ASSERT_DEVICE_ERROR(statement) \
    StartExpectDeviceError(); \
    statement; \
    ASSERT_TRUE(EndExpectDeviceError());

class ValidationTest : public testing::Test {
    public:
        ValidationTest();
        ~ValidationTest();

        void TearDown() override;

        void StartExpectDeviceError();
        bool EndExpectDeviceError();
        std::string GetLastDeviceErrorMessage() const;

        // Helper functions to create objects to test validation.

        struct DummyRenderPass : public dawn::RenderPassDescriptor{
          public:
            DummyRenderPass(const dawn::Device& device);
            dawn::Texture attachment;
            dawn::TextureFormat attachmentFormat;
            uint32_t width;
            uint32_t height;

          private:
            dawn::RenderPassColorAttachmentDescriptor mColorAttachment;
            dawn::RenderPassColorAttachmentDescriptor* mColorAttachments[1];
        };

    protected:
        dawn::Device device;

    private:
        std::unique_ptr<dawn_native::Instance> mInstance;

        static void OnDeviceError(const char* message, DawnCallbackUserdata userdata);
        std::string mDeviceErrorMessage;
        bool mExpectError = false;
        bool mError = false;
};

#endif // TESTS_UNITTESTS_VALIDATIONTEST_H_
