// Copyright 2022 The Tint 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 "gmock/gmock.h"
#include "src/writer/glsl/test_helper.h"

using ::testing::HasSubstr;

namespace tint {
namespace writer {
namespace glsl {
namespace {

using GlslGeneratorImplTest_UniformBuffer = TestHelper;

TEST_F(GlslGeneratorImplTest_UniformBuffer, Simple) {
  auto* simple = Structure("Simple", {Member("member", ty.f32())});
  Global("simple", ty.Of(simple), ast::StorageClass::kUniform,
         GroupAndBinding(0, 0));

  GeneratorImpl& gen = Build();

  ASSERT_TRUE(gen.Generate()) << gen.error();
  EXPECT_EQ(gen.result(), R"(#version 310 es

struct Simple {
  float member;
};

layout(binding = 0) uniform Simple_1 {
  float member;
} simple;

)");
}

TEST_F(GlslGeneratorImplTest_UniformBuffer, Simple_Desktop) {
  auto* simple = Structure("Simple", {Member("member", ty.f32())});
  Global("simple", ty.Of(simple), ast::StorageClass::kUniform,
         GroupAndBinding(0, 0));

  GeneratorImpl& gen = Build(Version(Version::Standard::kDesktop, 4, 4));

  ASSERT_TRUE(gen.Generate()) << gen.error();
  EXPECT_EQ(gen.result(), R"(#version 440

struct Simple {
  float member;
};

layout(binding = 0, std140) uniform Simple_1 {
  float member;
} simple;

)");
}

}  // namespace
}  // namespace glsl
}  // namespace writer
}  // namespace tint
