// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "flutter/testing/testing.h"  // IWYU pragma: keep
#include "fml/mapping.h"
#include "gtest/gtest.h"
#include "impeller/renderer/backend/gles/proc_table_gles.h"
#include "impeller/renderer/backend/gles/test/mock_gles.h"

namespace impeller {
namespace testing {

TEST(SpecConstant, CanCreateShaderWithSpecializationConstant) {
  auto mock_gles = MockGLES::Init();
  auto& proc_table = mock_gles->GetProcTable();
  auto shader_source =
      "#version 100\n"
      "#ifndef SPIRV_CROSS_CONSTANT_ID_0\n"
      "#define SPIRV_CROSS_CONSTANT_ID_0 1\n"
      "#endif\n"
      "void main() { return vec4(0.0); }";
  auto test_shader = std::make_shared<fml::DataMapping>(shader_source);

  auto result = proc_table.ComputeShaderWithDefines(*test_shader, {0});

  auto expected_shader_source =
      "#version 100\n"
      "#define SPIRV_CROSS_CONSTANT_ID_0 0\n"
      "#ifndef SPIRV_CROSS_CONSTANT_ID_0\n"
      "#define SPIRV_CROSS_CONSTANT_ID_0 1\n"
      "#endif\n"
      "void main() { return vec4(0.0); }";

  if (!result.has_value()) {
    GTEST_FAIL() << "Expected shader source";
  }
  ASSERT_EQ(result.value(), expected_shader_source);
}

TEST(SpecConstant, CanCreateShaderWithSpecializationConstantMultipleValues) {
  auto mock_gles = MockGLES::Init();
  auto& proc_table = mock_gles->GetProcTable();
  auto shader_source =
      "#version 100\n"
      "#ifndef SPIRV_CROSS_CONSTANT_ID_0\n"
      "#define SPIRV_CROSS_CONSTANT_ID_0 1\n"
      "#endif\n"
      "void main() { return vec4(0.0); }";
  auto test_shader = std::make_shared<fml::DataMapping>(shader_source);

  auto result =
      proc_table.ComputeShaderWithDefines(*test_shader, {0, 1, 2, 3, 4, 5});

  auto expected_shader_source =
      "#version 100\n"
      "#define SPIRV_CROSS_CONSTANT_ID_0 0\n"
      "#define SPIRV_CROSS_CONSTANT_ID_1 1\n"
      "#define SPIRV_CROSS_CONSTANT_ID_2 2\n"
      "#define SPIRV_CROSS_CONSTANT_ID_3 3\n"
      "#define SPIRV_CROSS_CONSTANT_ID_4 4\n"
      "#define SPIRV_CROSS_CONSTANT_ID_5 5\n"
      "#ifndef SPIRV_CROSS_CONSTANT_ID_0\n"
      "#define SPIRV_CROSS_CONSTANT_ID_0 1\n"
      "#endif\n"
      "void main() { return vec4(0.0); }";

  if (!result.has_value()) {
    GTEST_FAIL() << "Expected shader source";
  }
  ASSERT_EQ(result.value(), expected_shader_source);
}

}  // namespace testing
}  // namespace impeller
