// Copyright 2021 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 "src/tint/transform/add_spirv_block_attribute.h"

#include <memory>
#include <utility>

#include "src/tint/transform/test_helper.h"

namespace tint {
namespace transform {
namespace {

using AddSpirvBlockAttributeTest = TransformTest;

TEST_F(AddSpirvBlockAttributeTest, EmptyModule) {
  auto* src = "";
  auto* expect = "";

  auto got = Run<AddSpirvBlockAttribute>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(AddSpirvBlockAttributeTest, Noop_UsedForPrivateVar) {
  auto* src = R"(
struct S {
  f : f32,
}

var<private> p : S;

@stage(fragment)
fn main() {
  p.f = 1.0;
}
)";
  auto* expect = src;

  auto got = Run<AddSpirvBlockAttribute>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(AddSpirvBlockAttributeTest, Noop_UsedForShaderIO) {
  auto* src = R"(
struct S {
  @location(0)
  f : f32,
}

@stage(fragment)
fn main() -> S {
  return S();
}
)";
  auto* expect = src;

  auto got = Run<AddSpirvBlockAttribute>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(AddSpirvBlockAttributeTest, BasicScalar) {
  auto* src = R"(
@group(0) @binding(0)
var<uniform> u : f32;

@stage(fragment)
fn main() {
  let f = u;
}
)";
  auto* expect = R"(
@internal(spirv_block)
struct u_block {
  inner : f32,
}

@group(0) @binding(0) var<uniform> u : u_block;

@stage(fragment)
fn main() {
  let f = u.inner;
}
)";

  auto got = Run<AddSpirvBlockAttribute>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(AddSpirvBlockAttributeTest, BasicArray) {
  auto* src = R"(
@group(0) @binding(0)
var<uniform> u : array<vec4<f32>, 4u>;

@stage(fragment)
fn main() {
  let a = u;
}
)";
  auto* expect = R"(
@internal(spirv_block)
struct u_block {
  inner : array<vec4<f32>, 4u>,
}

@group(0) @binding(0) var<uniform> u : u_block;

@stage(fragment)
fn main() {
  let a = u.inner;
}
)";

  auto got = Run<AddSpirvBlockAttribute>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(AddSpirvBlockAttributeTest, BasicArray_Alias) {
  auto* src = R"(
type Numbers = array<vec4<f32>, 4u>;

@group(0) @binding(0)
var<uniform> u : Numbers;

@stage(fragment)
fn main() {
  let a = u;
}
)";
  auto* expect = R"(
type Numbers = array<vec4<f32>, 4u>;

@internal(spirv_block)
struct u_block {
  inner : array<vec4<f32>, 4u>,
}

@group(0) @binding(0) var<uniform> u : u_block;

@stage(fragment)
fn main() {
  let a = u.inner;
}
)";

  auto got = Run<AddSpirvBlockAttribute>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(AddSpirvBlockAttributeTest, BasicStruct) {
  auto* src = R"(
struct S {
  f : f32,
};

@group(0) @binding(0)
var<uniform> u : S;

@stage(fragment)
fn main() {
  let f = u.f;
}
)";
  auto* expect = R"(
@internal(spirv_block)
struct S {
  f : f32,
}

@group(0) @binding(0) var<uniform> u : S;

@stage(fragment)
fn main() {
  let f = u.f;
}
)";

  auto got = Run<AddSpirvBlockAttribute>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(AddSpirvBlockAttributeTest, Nested_OuterBuffer_InnerNotBuffer) {
  auto* src = R"(
struct Inner {
  f : f32,
};

struct Outer {
  i : Inner,
};

@group(0) @binding(0)
var<uniform> u : Outer;

@stage(fragment)
fn main() {
  let f = u.i.f;
}
)";
  auto* expect = R"(
struct Inner {
  f : f32,
}

@internal(spirv_block)
struct Outer {
  i : Inner,
}

@group(0) @binding(0) var<uniform> u : Outer;

@stage(fragment)
fn main() {
  let f = u.i.f;
}
)";

  auto got = Run<AddSpirvBlockAttribute>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(AddSpirvBlockAttributeTest, Nested_OuterBuffer_InnerBuffer) {
  auto* src = R"(
struct Inner {
  f : f32,
};

struct Outer {
  i : Inner,
};

@group(0) @binding(0)
var<uniform> u0 : Outer;

@group(0) @binding(1)
var<uniform> u1 : Inner;

@stage(fragment)
fn main() {
  let f0 = u0.i.f;
  let f1 = u1.f;
}
)";
  auto* expect = R"(
struct Inner {
  f : f32,
}

@internal(spirv_block)
struct Outer {
  i : Inner,
}

@group(0) @binding(0) var<uniform> u0 : Outer;

@internal(spirv_block)
struct u1_block {
  inner : Inner,
}

@group(0) @binding(1) var<uniform> u1 : u1_block;

@stage(fragment)
fn main() {
  let f0 = u0.i.f;
  let f1 = u1.inner.f;
}
)";

  auto got = Run<AddSpirvBlockAttribute>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(AddSpirvBlockAttributeTest, Nested_OuterNotBuffer_InnerBuffer) {
  auto* src = R"(
struct Inner {
  f : f32,
};

struct Outer {
  i : Inner,
};

var<private> p : Outer;

@group(0) @binding(1)
var<uniform> u : Inner;

@stage(fragment)
fn main() {
  let f0 = p.i.f;
  let f1 = u.f;
}
)";
  auto* expect = R"(
struct Inner {
  f : f32,
}

struct Outer {
  i : Inner,
}

var<private> p : Outer;

@internal(spirv_block)
struct u_block {
  inner : Inner,
}

@group(0) @binding(1) var<uniform> u : u_block;

@stage(fragment)
fn main() {
  let f0 = p.i.f;
  let f1 = u.inner.f;
}
)";

  auto got = Run<AddSpirvBlockAttribute>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(AddSpirvBlockAttributeTest, Nested_InnerUsedForMultipleBuffers) {
  auto* src = R"(
struct Inner {
  f : f32,
};

struct S {
  i : Inner,
};

@group(0) @binding(0)
var<uniform> u0 : S;

@group(0) @binding(1)
var<uniform> u1 : Inner;

@group(0) @binding(2)
var<uniform> u2 : Inner;

@stage(fragment)
fn main() {
  let f0 = u0.i.f;
  let f1 = u1.f;
  let f2 = u2.f;
}
)";
  auto* expect = R"(
struct Inner {
  f : f32,
}

@internal(spirv_block)
struct S {
  i : Inner,
}

@group(0) @binding(0) var<uniform> u0 : S;

@internal(spirv_block)
struct u1_block {
  inner : Inner,
}

@group(0) @binding(1) var<uniform> u1 : u1_block;

@group(0) @binding(2) var<uniform> u2 : u1_block;

@stage(fragment)
fn main() {
  let f0 = u0.i.f;
  let f1 = u1.inner.f;
  let f2 = u2.inner.f;
}
)";

  auto got = Run<AddSpirvBlockAttribute>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(AddSpirvBlockAttributeTest, StructInArray) {
  auto* src = R"(
struct S {
  f : f32,
};

@group(0) @binding(0)
var<uniform> u : S;

@stage(fragment)
fn main() {
  let f = u.f;
  let a = array<S, 4>();
}
)";
  auto* expect = R"(
struct S {
  f : f32,
}

@internal(spirv_block)
struct u_block {
  inner : S,
}

@group(0) @binding(0) var<uniform> u : u_block;

@stage(fragment)
fn main() {
  let f = u.inner.f;
  let a = array<S, 4>();
}
)";

  auto got = Run<AddSpirvBlockAttribute>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(AddSpirvBlockAttributeTest, StructInArray_MultipleBuffers) {
  auto* src = R"(
struct S {
  f : f32,
};

@group(0) @binding(0)
var<uniform> u0 : S;

@group(0) @binding(1)
var<uniform> u1 : S;

@stage(fragment)
fn main() {
  let f0 = u0.f;
  let f1 = u1.f;
  let a = array<S, 4>();
}
)";
  auto* expect = R"(
struct S {
  f : f32,
}

@internal(spirv_block)
struct u0_block {
  inner : S,
}

@group(0) @binding(0) var<uniform> u0 : u0_block;

@group(0) @binding(1) var<uniform> u1 : u0_block;

@stage(fragment)
fn main() {
  let f0 = u0.inner.f;
  let f1 = u1.inner.f;
  let a = array<S, 4>();
}
)";

  auto got = Run<AddSpirvBlockAttribute>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(AddSpirvBlockAttributeTest, Aliases_Nested_OuterBuffer_InnerBuffer) {
  auto* src = R"(
struct Inner {
  f : f32,
};

type MyInner = Inner;

struct Outer {
  i : MyInner,
};

type MyOuter = Outer;

@group(0) @binding(0)
var<uniform> u0 : MyOuter;

@group(0) @binding(1)
var<uniform> u1 : MyInner;

@stage(fragment)
fn main() {
  let f0 = u0.i.f;
  let f1 = u1.f;
}
)";
  auto* expect = R"(
struct Inner {
  f : f32,
}

type MyInner = Inner;

@internal(spirv_block)
struct Outer {
  i : MyInner,
}

type MyOuter = Outer;

@group(0) @binding(0) var<uniform> u0 : MyOuter;

@internal(spirv_block)
struct u1_block {
  inner : Inner,
}

@group(0) @binding(1) var<uniform> u1 : u1_block;

@stage(fragment)
fn main() {
  let f0 = u0.i.f;
  let f1 = u1.inner.f;
}
)";

  auto got = Run<AddSpirvBlockAttribute>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(AddSpirvBlockAttributeTest,
       Aliases_Nested_OuterBuffer_InnerBuffer_OutOfOrder) {
  auto* src = R"(
@stage(fragment)
fn main() {
  let f0 = u0.i.f;
  let f1 = u1.f;
}

@group(0) @binding(1)
var<uniform> u1 : MyInner;

type MyInner = Inner;

@group(0) @binding(0)
var<uniform> u0 : MyOuter;

type MyOuter = Outer;

struct Outer {
  i : MyInner,
};

struct Inner {
  f : f32,
};
)";
  auto* expect = R"(
@stage(fragment)
fn main() {
  let f0 = u0.i.f;
  let f1 = u1.inner.f;
}

@internal(spirv_block)
struct u1_block {
  inner : Inner,
}

@group(0) @binding(1) var<uniform> u1 : u1_block;

type MyInner = Inner;

@group(0) @binding(0) var<uniform> u0 : MyOuter;

type MyOuter = Outer;

@internal(spirv_block)
struct Outer {
  i : MyInner,
}

struct Inner {
  f : f32,
}
)";

  auto got = Run<AddSpirvBlockAttribute>(src);

  EXPECT_EQ(expect, str(got));
}

}  // namespace
}  // namespace transform
}  // namespace tint
