/*-------------------------------------------------------------------------
 * OpenGL Conformance Test Suite
 * -----------------------------
 *
 * Copyright (c) 2014-2016 The Khronos Group Inc.
 *
 * 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.
 *
 */ /*!
 * \file
 * \brief
 */ /*-------------------------------------------------------------------*/

#include "esextcGeometryShaderTests.hpp"
#include "deRandom.hpp"
#include "deStringUtil.hpp"
#include "tcuCommandLine.hpp"

#include "esextcGeometryShaderAPI.hpp"
#include "esextcGeometryShaderAdjacencyTests.hpp"
#include "esextcGeometryShaderBlitting.hpp"
#include "esextcGeometryShaderClipping.hpp"
#include "esextcGeometryShaderConstantVariables.hpp"
#include "esextcGeometryShaderInput.hpp"
#include "esextcGeometryShaderLayeredFBO.hpp"
#include "esextcGeometryShaderLayeredFramebuffer.hpp"
#include "esextcGeometryShaderLayeredRendering.hpp"
#include "esextcGeometryShaderLayeredRenderingBoundaryCondition.hpp"
#include "esextcGeometryShaderLayeredRenderingFBONoAttachment.hpp"
#include "esextcGeometryShaderLimits.hpp"
#include "esextcGeometryShaderLinking.hpp"
#include "esextcGeometryShaderNonarrayInput.hpp"
#include "esextcGeometryShaderOutput.hpp"
#include "esextcGeometryShaderPrimitiveCounter.hpp"
#include "esextcGeometryShaderPrimitiveQueries.hpp"
#include "esextcGeometryShaderProgramResource.hpp"
#include "esextcGeometryShaderQualifiers.hpp"
#include "esextcGeometryShaderRendering.hpp"

namespace glcts
{
/** Constructor
 *
 * @param context       Test context
 * @param glslVersion   GLSL version
 * @param extType       Extension type
 **/
GeometryShaderTests::GeometryShaderTests(Context &context, const ExtParameters &extParams)
    : TestCaseGroupBase(context, extParams, "geometry_shader", "Geometry Shader tests")
{
}

/**
 * Initializes test groups for geometry shader tests
 **/
void GeometryShaderTests::init(void)
{
    /* Creating Test Groups */
    TestCaseGroupBase *renderingTestGroup =
        new TestCaseGroupBase(m_context, m_extParams, "rendering", "Rendering (Test Group 1)");
    TestCaseGroupBase *adjacencyTestGroup =
        new GeometryShaderAdjacencyTests(m_context, m_extParams, "adjacency", "Adjacency (Test Group 2)");
    TestCaseGroupBase *programResourceTestGroup =
        new TestCaseGroupBase(m_context, m_extParams, "program_resource", "Program Resource (Test Group 3)");
    TestCaseGroupBase *nonarrayInputTestGroup =
        new TestCaseGroupBase(m_context, m_extParams, "nonarray_input", "Nonarray input (Test Group 4)");
    TestCaseGroupBase *inputTestGroup = new TestCaseGroupBase(m_context, m_extParams, "input", "Input (Test Group 5)");

    GeometryShaderPrimitiveCounterTestGroup *primitiveCounterTestGroup = new GeometryShaderPrimitiveCounterTestGroup(
        m_context, m_extParams, "primitive_counter", "PrimitiveCounter (Test Group 6)");

    TestCaseGroupBase *layeredRenderingTestGroup =
        new TestCaseGroupBase(m_context, m_extParams, "layered_rendering", "Layered rendering (Test Group 7)");
    TestCaseGroupBase *clippingTestGroup =
        new TestCaseGroupBase(m_context, m_extParams, "clipping", "Clipping (Test Group 8)");
    TestCaseGroupBase *blittingTestGroup =
        new TestCaseGroupBase(m_context, m_extParams, "blitting", "Blitting (Test Group 9)");

    TestCaseGroupBase *layeredRenderingBoudaryCondition =
        new TestCaseGroupBase(m_context, m_extParams, "layered_rendering_boundary_condition",
                              "Layered Rendering Boundary Condition (Test Group 10)");

    TestCaseGroupBase *layeredFramebufferTestGroup =
        new TestCaseGroupBase(m_context, m_extParams, "layered_framebuffer", "Layered framebuffer (Test Group 11)");

    TestCaseGroupBase *outputTestGroup =
        new TestCaseGroupBase(m_context, m_extParams, "output", "Output (Test Group 12)");
    TestCaseGroupBase *primitiveQueriesTestGroup =
        new TestCaseGroupBase(m_context, m_extParams, "primitive_queries", "Primitive Queries (Test Group 13)");

    TestCaseGroupBase *layeredRenderingFBONoAttachmentTestGroup =
        new TestCaseGroupBase(m_context, m_extParams, "layered_rendering_fbo_no_attachment",
                              "Layered rendering FBO no attachment (Test Group 14)");

    TestCaseGroupBase *constantVariablesTestGroup =
        new TestCaseGroupBase(m_context, m_extParams, "constant_variables", "Constant Variables (Test Group 15)");
    TestCaseGroupBase *limitsTestGroup =
        new TestCaseGroupBase(m_context, m_extParams, "limits", "Limits (Test Group 16)");
    TestCaseGroupBase *linkingTestGroup =
        new TestCaseGroupBase(m_context, m_extParams, "linking", "Linking (Test Group 17 & Test Group 20)");
    TestCaseGroupBase *apiTestGroup =
        new TestCaseGroupBase(m_context, m_extParams, "api", "API interactions (Test Group 18)");
    TestCaseGroupBase *qualifiersTestGroup =
        new TestCaseGroupBase(m_context, m_extParams, "qualifiers", "Layout qualifiers (Test Group 22)");
    TestCaseGroupBase *layeredFBOTestGroup =
        new TestCaseGroupBase(m_context, m_extParams, "layered_fbo", "Layered FBOs (Test Group 21) & Test Group 26 ");

    /* Adding tests groups as children of this test suite */
    addChild(adjacencyTestGroup);
    addChild(renderingTestGroup);
    addChild(programResourceTestGroup);
    addChild(nonarrayInputTestGroup);
    addChild(inputTestGroup);
    addChild(primitiveCounterTestGroup);
    addChild(layeredRenderingTestGroup);
    addChild(clippingTestGroup);
    addChild(blittingTestGroup);
    addChild(layeredRenderingBoudaryCondition);
    addChild(layeredFramebufferTestGroup);
    addChild(outputTestGroup);
    addChild(primitiveQueriesTestGroup);
    addChild(layeredRenderingFBONoAttachmentTestGroup);
    addChild(constantVariablesTestGroup);
    addChild(limitsTestGroup);
    addChild(linkingTestGroup);
    addChild(apiTestGroup);
    addChild(qualifiersTestGroup);
    addChild(layeredFBOTestGroup);

    /* Adding tests to test groups */

    /* Rendering test (Test Group 1) */
    renderingTestGroup->addChild(new GeometryShaderRendering(m_context, m_extParams, "rendering", "Test 1"));

    /* Program Resource test (Test Group 3) */
    programResourceTestGroup->addChild(
        new GeometryShaderProgramResourceTest(m_context, m_extParams, "program_resource", "Test 3.1"));

    /* Nonarray input tests (Test Group 4) */
    nonarrayInputTestGroup->addChild(
        new GeometryShaderNonarrayInputCase(m_context, m_extParams, "nonarray_input", "Test 4.1"));

    /* Input tests (Test Group 5) */
    inputTestGroup->addChild(
        new GeometryShader_gl_in_ArrayContentsTest(m_context, m_extParams, "gl_in_array_contents", "Test 5.1"));
    inputTestGroup->addChild(
        new GeometryShader_gl_in_ArrayLengthTest(m_context, m_extParams, "gl_in_array_length", "Test 5.2"));
    inputTestGroup->addChild(
        new GeometryShader_gl_PointSize_ValueTest(m_context, m_extParams, "gl_pointsize_value", "Test 5.3"));
    inputTestGroup->addChild(
        new GeometryShader_gl_Position_ValueTest(m_context, m_extParams, "gl_position_value", "Test 5.4"));

    /* PrimitiveCounter tests (Test Group 6) */
    //inputTestGroup->addChild(new PrimitiveCounter(m_context, m_extParams, "gl_primitive_counter", "Test 6"));
    /* Layered rendering (Test Group 7 & Test Group 21) */
    layeredRenderingTestGroup->addChild(new GeometryShaderLayeredRendering(m_context, m_extParams, "layered_rendering",
                                                                           "Tests 7.1, 7.2, 7.3, 7.4 & 21.3"));

    /* Clipping (Test group 8)*/
    clippingTestGroup->addChild(new GeometryShaderClipping(m_context, m_extParams, "clipping", "Test 8.1"));

    /* Clipping (Test group 9)*/
    blittingTestGroup->addChild(
        new GeometryShaderBlittingLayeredToNonLayered(m_context, m_extParams, "layered_nonlayered", "Test 9.1"));
    blittingTestGroup->addChild(
        new GeometryShaderBlittingNonLayeredToLayered(m_context, m_extParams, "nonlayered_layered", "Test 9.2"));
    blittingTestGroup->addChild(
        new GeometryShaderBlittingLayeredToLayered(m_context, m_extParams, "layered_layered", "Test 9.3"));

    /* Layered rendering Boundary Condition FBO no attachment (Test Group 10) */
    layeredRenderingBoudaryCondition->addChild(new GeometryShaderLayeredRenderingBoundaryConditionVariousTextures(
        m_context, m_extParams, "layered_rendering_boundary_condition_various_textures", "Test 10.1"));

    layeredRenderingBoudaryCondition->addChild(new GeometryShaderLayeredRenderingBoundaryConditionNoGS(
        m_context, m_extParams, "layered_rendering_boundary_condition_no_gs", "Test 10.2"));

    layeredRenderingBoudaryCondition->addChild(new GeometryShaderLayeredRenderingBoundaryConditionNoLayerSet(
        m_context, m_extParams, "layered_rendering_boundary_condition_no_default_layer", "Test 10.3"));

    layeredRenderingBoudaryCondition->addChild(new GeometryShaderLayeredRenderingBoundaryConditionNoLayeredFBO(
        m_context, m_extParams, "layered_rendering_boundary_condition_no_layered_fbo", "Test 10.4"));

    /* Layered framebuffer (Test Group 11) */
    layeredFramebufferTestGroup->addChild(
        new GeometryShaderLayeredFramebufferStencil(m_context, m_extParams, "stencil_support", "Test 11.1"));
    layeredFramebufferTestGroup->addChild(
        new GeometryShaderLayeredFramebufferDepth(m_context, m_extParams, "depth_support", "Test 11.2"));
    layeredFramebufferTestGroup->addChild(
        new GeometryShaderLayeredFramebufferBlending(m_context, m_extParams, "blending_support", "Tests 11.3"));
    layeredFramebufferTestGroup->addChild(
        new GeometryShaderLayeredFramebufferClear(m_context, m_extParams, "clear_call_support", "Tests 11.4, 11.5"));

    /* Output (Test Group 12) */
    outputTestGroup->addChild(new GeometryShaderDuplicateOutputLayoutQualifierTest(
        m_context, m_extParams, "conflicted_output_primitive", "Test 12.1"));
    outputTestGroup->addChild(new GeometryShaderDuplicateMaxVerticesLayoutQualifierTest(
        m_context, m_extParams, "conflicted_output_vertices_max", "Test 12.2"));
    outputTestGroup->addChild(
        new GeometryShaderIfVertexEmitIsDoneAtEndTest(m_context, m_extParams, "vertex_emit_at_end", "Test 12.3"));
    outputTestGroup->addChild(new GeometryShaderMissingEndPrimitiveCallTest(m_context, m_extParams,
                                                                            "primitive_end_done_at_end", "Test 12.4"));
    outputTestGroup->addChild(new GeometryShaderMissingEndPrimitiveCallForSinglePrimitiveTest(
        m_context, m_extParams, "primite_end_done_for_single_primitive", "Test 12.5"));

    /* Layered rendering FBO no attachment (Test Group 13) */
    primitiveQueriesTestGroup->addChild(new GeometryShaderPrimitiveQueriesPoints(
        m_context, m_extParams, "primitive_queries_points", "Test 13.1, 13.2 - Points"));
    primitiveQueriesTestGroup->addChild(new GeometryShaderPrimitiveQueriesLines(
        m_context, m_extParams, "primitive_queries_lines", "Test 13.1, 13.2 - Lines"));
    primitiveQueriesTestGroup->addChild(new GeometryShaderPrimitiveQueriesTriangles(
        m_context, m_extParams, "primitive_queries_triangles", "Test 13.1, 13.2 - Triangles"));

    /* Layered rendering FBO no attachment (Test Group 14 & Test Group 21) */
    layeredRenderingFBONoAttachmentTestGroup->addChild(new GeometryShaderLayeredRenderingFBONoAttachment(
        m_context, m_extParams, "layered_rendering_fbo_no_attachment", "Test 14.1, 14.2, Test 21.4"));

    /* Constants Variables (Test Group 15) */
    constantVariablesTestGroup->addChild(
        new GeometryShaderConstantVariables(m_context, m_extParams, "constant_variables", "Test 15.1, Test 15.2"));

    /* Limits (Test Group 16) */
    limitsTestGroup->addChild(
        new GeometryShaderMaxUniformComponentsTest(m_context, m_extParams, "max_uniform_components", "Test 16.1"));
    limitsTestGroup->addChild(
        new GeometryShaderMaxUniformBlocksTest(m_context, m_extParams, "max_uniform_blocks", "Test 16.2"));
    limitsTestGroup->addChild(
        new GeometryShaderMaxInputComponentsTest(m_context, m_extParams, "max_input_components", "Test 16.3"));
    limitsTestGroup->addChild(
        new GeometryShaderMaxOutputComponentsTest(m_context, m_extParams, "max_output_components", "Test 16.4"));
    limitsTestGroup->addChild(
        new GeometryShaderMaxOutputVerticesTest(m_context, m_extParams, "max_output_vertices", "Test 16.5"));
    limitsTestGroup->addChild(new GeometryShaderMaxOutputComponentsSinglePointTest(
        m_context, m_extParams, "max_output_components_single_point", "Test 16.6"));
    limitsTestGroup->addChild(
        new GeometryShaderMaxTextureUnitsTest(m_context, m_extParams, "max_texture_units", "Test 16.7"));
    limitsTestGroup->addChild(
        new GeometryShaderMaxInvocationsTest(m_context, m_extParams, "max_invocations", "Test 16.8"));
    limitsTestGroup->addChild(new GeometryShaderMaxCombinedTextureUnitsTest(m_context, m_extParams,
                                                                            "max_combined_texture_units", "Test 16.9"));

    /* Linking (Test Group 17 & Test Group 20 & part of Test Group 23 & part of Test Group 24 & part of Test Group 25) */
    linkingTestGroup->addChild(new GeometryShaderIncompleteProgramObjectsTest(
        m_context, m_extParams, "incomplete_program_objects", "Test 17.1, 17.2"));
    linkingTestGroup->addChild(
        new GeometryShaderIncompleteGSTest(m_context, m_extParams, "incomplete_gs", "Test 17.3"));
    linkingTestGroup->addChild(new GeometryShaderInvalidArrayedInputVariablesTest(
        m_context, m_extParams, "invalid_arrayed_input_variables", "Test 17.4"));

    linkingTestGroup->addChild(new GeometryShaderVSGSVariableTypeMismatchTest(
        m_context, m_extParams, "vs_gs_variable_type_mismatch", "Test 20.1"));
    linkingTestGroup->addChild(new GeometryShaderVSGSVariableQualifierMismatchTest(
        m_context, m_extParams, "vs_gs_variable_qualifier_mismatch", "Test 20.2"));
    linkingTestGroup->addChild(new GeometryShaderVSGSArrayedVariableSizeMismatchTest(
        m_context, m_extParams, "vs_gs_arrayed_variable_size_mismatch", "Test 20.3"));
    linkingTestGroup->addChild(
        new GeometryShaderFragCoordRedeclarationTest(m_context, m_extParams, "fragcoord_redeclaration", "Test 20.4"));
    linkingTestGroup->addChild(
        new GeometryShaderLocationAliasingTest(m_context, m_extParams, "location_aliasing", "Test 20.5"));

    linkingTestGroup->addChild(new GeometryShaderMoreACsInGSThanSupportedTest(
        m_context, m_extParams, "more_ACs_in_GS_than_supported", "Test 23.4"));
    linkingTestGroup->addChild(new GeometryShaderMoreACBsInGSThanSupportedTest(
        m_context, m_extParams, "more_ACBs_in_GS_than_supported", "Test 23.6"));

    linkingTestGroup->addChild(
        new GeometryShaderCompilationFailTest(m_context, m_extParams, "geometry_shader_compilation_fail", "Test 24.1"));
    linkingTestGroup->addChild(new GeometryShaderMoreInputVerticesThanAvailableTest(
        m_context, m_extParams, "more_input_vertices_in_GS_than_available", "Test 24.4"));

    linkingTestGroup->addChild(new GeometryShaderTransformFeedbackVertexAndGeometryShaderCaptureTest(
        m_context, m_extParams, "tf_capture_from_gs_and_vs_variables", "Test 25.1"));

    /* API interactions (Test Group 18 & Test Group 19 & part of Test Group 23  & part of Test Group 24 & part of Test Group 25) */
    apiTestGroup->addChild(
        new GeometryShaderCreateShaderProgramvTest(m_context, m_extParams, "createShaderProgramv", "Test 18.1"));
    apiTestGroup->addChild(new GeometryShaderGetShaderivTest(m_context, m_extParams, "shader_type", "Test 18.2"));
    apiTestGroup->addChild(new GeometryShaderGetProgramivTest(m_context, m_extParams, "getProgramiv", "Test 18.3"));
    apiTestGroup->addChild(new GeometryShaderGetProgramiv2Test(m_context, m_extParams, "getProgramiv2", "Test 18.4"));

    apiTestGroup->addChild(new GeometryShaderGetProgramiv3Test(m_context, m_extParams, "getProgramiv3", "Test 19.1"));
    apiTestGroup->addChild(
        new GeometryShaderDrawCallWithFSAndGS(m_context, m_extParams, "fs_gs_draw_call", "Test 19.2"));

    apiTestGroup->addChild(
        new GeometryShaderMaxImageUniformsTest(m_context, m_extParams, "max_image_uniforms", "Test 23.1"));
    apiTestGroup->addChild(
        new GeometryShaderMaxShaderStorageBlocksTest(m_context, m_extParams, "max_shader_storage_blocks", "Test 23.2"));
    apiTestGroup->addChild(
        new GeometryShaderMaxAtomicCountersTest(m_context, m_extParams, "max_atomic_counters", "Test 23.3"));
    apiTestGroup->addChild(new GeometryShaderMaxAtomicCounterBuffersTest(m_context, m_extParams,
                                                                         "max_atomic_counter_buffers", "Test 23.5"));

    apiTestGroup->addChild(new GeometryShaderPiplineProgramObjectWithoutActiveVSProgramTest(
        m_context, m_extParams, "pipeline_program_without_active_vs", "Test 24.2"));
    apiTestGroup->addChild(new GeometryShaderIncompatibleDrawCallModeTest(m_context, m_extParams,
                                                                          "incompatible_draw_call_mode", "Test 24.3"));
    apiTestGroup->addChild(new GeometryShaderInsufficientEmittedVerticesTest(
        m_context, m_extParams, "insufficient_emitted_vertices", "Test 24.5"));

    apiTestGroup->addChild(new GeometryShaderPipelineObjectTransformFeedbackVertexAndGeometryShaderCaptureTest(
        m_context, m_extParams, "program_pipeline_vs_gs_capture", "Test 25.2"));

    apiTestGroup->addChild(new GeometryShaderDrawPrimitivesDoNotMatchOutputPrimitives(
        m_context, m_extParams, "draw_primitives_do_not_match_output_primitives", "Test 25.3"));
    apiTestGroup->addChild(
        new GeometryShaderDrawCallsWhileTFPaused(m_context, m_extParams, "draw_calls_while_tf_is_paused", "Test 25.4"));

    /* Layered FBOs (Test Group 21) & Test Group 26 */
    layeredFBOTestGroup->addChild(
        new GeometryShaderIncompleteLayeredFBOTest(m_context, m_extParams, "layered_fbo", "Test 21.1"));
    layeredFBOTestGroup->addChild(new GeometryShaderIncompleteLayeredAttachmentsTest(
        m_context, m_extParams, "layered_fbo_attachments", "Test 21.2"));

    layeredFBOTestGroup->addChild(new GeometryShaderFramebufferTextureInvalidTarget(
        m_context, m_extParams, "fb_texture_invalid_target", "Test 26.1"));
    layeredFBOTestGroup->addChild(new GeometryShaderFramebufferTextureNoFBOBoundToTarget(
        m_context, m_extParams, "fb_texture_no_fbo_bound_to_target", "Test 26.2"));
    layeredFBOTestGroup->addChild(new GeometryShaderFramebufferTextureInvalidAttachment(
        m_context, m_extParams, "fb_texture_invalid_attachment", "Test 26.3"));
    layeredFBOTestGroup->addChild(new GeometryShaderFramebufferTextureInvalidValue(
        m_context, m_extParams, "fb_texture_invalid_value", "Test 26.4"));
    layeredFBOTestGroup->addChild(new GeometryShaderFramebufferTextureInvalidLevelNumber(
        m_context, m_extParams, "fb_texture_invalid_level_number", "Test 26.5"));
    layeredFBOTestGroup->addChild(new GeometryShaderFramebufferTextureArgumentRefersToBufferTexture(
        m_context, m_extParams, "fb_texture_argument_refers_to_buffer_texture", "Test 26.6"));

    /* Layout qualifiers (Test Group 22) */
    qualifiersTestGroup->addChild(
        new GeometryShaderFlatInterpolationTest(m_context, m_extParams, "flat_interpolation", "Test 22.1"));
}

} // namespace glcts
