// Copyright 2018 The NXT 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/unittests/validation/ValidationTest.h"

class SetScissorRectTest : public ValidationTest {
};

// Test to check that SetScissor can only be used inside render passes
TEST_F(SetScissorRectTest, AllowedOnlyInRenderPass) {
    DummyRenderPass renderPass = CreateDummyRenderPass();

    AssertWillBeSuccess(device.CreateCommandBufferBuilder())
        .BeginRenderPass(renderPass.renderPass)
        .SetScissorRect(0, 0, 1, 1)
        .EndRenderPass()
        .GetResult();

    AssertWillBeError(device.CreateCommandBufferBuilder())
        .SetScissorRect(0, 0, 1, 1)
        .GetResult();

    AssertWillBeError(device.CreateCommandBufferBuilder())
        .BeginComputePass()
        .SetScissorRect(0, 0, 1, 1)
        .EndComputePass()
        .GetResult();
}

// Test to check that an empty scissor is allowed
TEST_F(SetScissorRectTest, EmptyScissor) {
    DummyRenderPass renderPass = CreateDummyRenderPass();

    AssertWillBeSuccess(device.CreateCommandBufferBuilder())
        .BeginRenderPass(renderPass.renderPass)
        .SetScissorRect(0, 0, 0, 0)
        .EndRenderPass()
        .GetResult();
}

// Test to check that a scissor larger than the framebuffer is allowed
// TODO(cwallez@chromium.org): scissor values seem to be integers in all APIs do the same
// and test negative values?
TEST_F(SetScissorRectTest, ScissorLargerThanFramebuffer) {
    DummyRenderPass renderPass = CreateDummyRenderPass();

    AssertWillBeSuccess(device.CreateCommandBufferBuilder())
        .BeginRenderPass(renderPass.renderPass)
        .SetScissorRect(0, 0, renderPass.width + 1, renderPass.height + 1)
        .EndRenderPass()
        .GetResult();
}

class SetBlendColorTest : public ValidationTest {
};

// Test to check that SetBlendColor can only be used inside render passes
TEST_F(SetBlendColorTest, AllowedOnlyInRenderPass) {
    DummyRenderPass renderPass = CreateDummyRenderPass();

    AssertWillBeSuccess(device.CreateCommandBufferBuilder())
        .BeginRenderPass(renderPass.renderPass)
        .SetBlendColor(0.0f, 0.0f, 0.0f, 0.0f)
        .EndRenderPass()
        .GetResult();

    AssertWillBeError(device.CreateCommandBufferBuilder())
        .SetBlendColor(0.0f, 0.0f, 0.0f, 0.0f)
        .GetResult();

    AssertWillBeError(device.CreateCommandBufferBuilder())
        .BeginComputePass()
        .SetBlendColor(0.0f, 0.0f, 0.0f, 0.0f)
        .EndComputePass()
        .GetResult();
}

// Test that SetBlendColor allows any value, large, small or negative
TEST_F(SetBlendColorTest, AnyValueAllowed) {
    DummyRenderPass renderPass = CreateDummyRenderPass();

    AssertWillBeSuccess(device.CreateCommandBufferBuilder())
        .BeginRenderPass(renderPass.renderPass)
        .SetBlendColor(-1.0f, 42.0f, -0.0f, 0.0f)
        .EndRenderPass()
        .GetResult();
}

class SetStencilReferenceTest : public ValidationTest {
};

// Test to check that SetStencilReference can only be used inside render passes
TEST_F(SetStencilReferenceTest, AllowedOnlyInRenderPass) {
    DummyRenderPass renderPass = CreateDummyRenderPass();

    AssertWillBeSuccess(device.CreateCommandBufferBuilder())
        .BeginRenderPass(renderPass.renderPass)
        .SetStencilReference(0)
        .EndRenderPass()
        .GetResult();

    AssertWillBeError(device.CreateCommandBufferBuilder())
        .SetStencilReference(0)
        .GetResult();

    AssertWillBeError(device.CreateCommandBufferBuilder())
        .BeginComputePass()
        .SetStencilReference(0)
        .EndComputePass()
        .GetResult();
}

// Test that SetStencilReference allows any bit to be set
TEST_F(SetStencilReferenceTest, AllBitsAllowed) {
    DummyRenderPass renderPass = CreateDummyRenderPass();

    AssertWillBeSuccess(device.CreateCommandBufferBuilder())
        .BeginRenderPass(renderPass.renderPass)
        .SetStencilReference(0xFFFFFFFF)
        .EndRenderPass()
        .GetResult();
}
