// 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/pad_array_elements.h"

#include <utility>

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

namespace tint {
namespace transform {
namespace {

using PadArrayElementsTest = TransformTest;

TEST_F(PadArrayElementsTest, ShouldRunEmptyModule) {
  auto* src = R"()";

  EXPECT_FALSE(ShouldRun<PadArrayElements>(src));
}

TEST_F(PadArrayElementsTest, ShouldRunHasImplicitArrayStride) {
  auto* src = R"(
var<private> arr : array<i32, 4>;
)";

  EXPECT_FALSE(ShouldRun<PadArrayElements>(src));
}

TEST_F(PadArrayElementsTest, ShouldRunHasExplicitArrayStride) {
  auto* src = R"(
var<private> arr : @stride(8) array<i32, 4>;
)";

  EXPECT_TRUE(ShouldRun<PadArrayElements>(src));
}

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

  auto got = Run<PadArrayElements>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(PadArrayElementsTest, ImplicitArrayStride) {
  auto* src = R"(
var<private> arr : array<i32, 4>;
)";
  auto* expect = src;

  auto got = Run<PadArrayElements>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(PadArrayElementsTest, ArrayAsGlobal) {
  auto* src = R"(
var<private> arr : @stride(8) array<i32, 4>;
)";
  auto* expect = R"(
struct tint_padded_array_element {
  @size(8)
  el : i32;
}

var<private> arr : array<tint_padded_array_element, 4u>;
)";

  auto got = Run<PadArrayElements>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(PadArrayElementsTest, RuntimeArray) {
  auto* src = R"(
struct S {
  rta : @stride(8) array<i32>;
};
)";
  auto* expect = R"(
struct tint_padded_array_element {
  @size(8)
  el : i32;
}

struct S {
  rta : array<tint_padded_array_element>;
}
)";

  auto got = Run<PadArrayElements>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(PadArrayElementsTest, ArrayFunctionVar) {
  auto* src = R"(
fn f() {
  var arr : @stride(16) array<i32, 4>;
  arr = @stride(16) array<i32, 4>();
  arr = @stride(16) array<i32, 4>(1, 2, 3, 4);
  let x = arr[3];
}
)";
  auto* expect = R"(
struct tint_padded_array_element {
  @size(16)
  el : i32;
}

fn f() {
  var arr : array<tint_padded_array_element, 4u>;
  arr = array<tint_padded_array_element, 4u>();
  arr = array<tint_padded_array_element, 4u>(tint_padded_array_element(1), tint_padded_array_element(2), tint_padded_array_element(3), tint_padded_array_element(4));
  let x = arr[3].el;
}
)";

  auto got = Run<PadArrayElements>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(PadArrayElementsTest, ArrayAsParam) {
  auto* src = R"(
fn f(a : @stride(12) array<i32, 4>) -> i32 {
  return a[2];
}
)";
  auto* expect = R"(
struct tint_padded_array_element {
  @size(12)
  el : i32;
}

fn f(a : array<tint_padded_array_element, 4u>) -> i32 {
  return a[2].el;
}
)";

  auto got = Run<PadArrayElements>(src);

  EXPECT_EQ(expect, str(got));
}

// TODO(crbug.com/tint/781): Cannot parse the stride on the return array type.
TEST_F(PadArrayElementsTest, DISABLED_ArrayAsReturn) {
  auto* src = R"(
fn f() -> @stride(8) array<i32, 4> {
  return array<i32, 4>(1, 2, 3, 4);
}
)";
  auto* expect = R"(
struct tint_padded_array_element {
  el : i32;
  @size(4)
  padding : u32;
};

fn f() -> array<tint_padded_array_element, 4> {
  return array<tint_padded_array_element, 4>(tint_padded_array_element(1, 0u), tint_padded_array_element(2, 0u), tint_padded_array_element(3, 0u), tint_padded_array_element(4, 0u));
}
)";

  auto got = Run<PadArrayElements>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(PadArrayElementsTest, ArrayAlias) {
  auto* src = R"(
type Array = @stride(16) array<i32, 4>;

fn f() {
  var arr : Array;
  arr = Array();
  arr = Array(1, 2, 3, 4);
  let vals : Array = Array(1, 2, 3, 4);
  arr = vals;
  let x = arr[3];
}
)";
  auto* expect = R"(
struct tint_padded_array_element {
  @size(16)
  el : i32;
}

type Array = array<tint_padded_array_element, 4u>;

fn f() {
  var arr : array<tint_padded_array_element, 4u>;
  arr = array<tint_padded_array_element, 4u>();
  arr = array<tint_padded_array_element, 4u>(tint_padded_array_element(1), tint_padded_array_element(2), tint_padded_array_element(3), tint_padded_array_element(4));
  let vals : array<tint_padded_array_element, 4u> = array<tint_padded_array_element, 4u>(tint_padded_array_element(1), tint_padded_array_element(2), tint_padded_array_element(3), tint_padded_array_element(4));
  arr = vals;
  let x = arr[3].el;
}
)";

  auto got = Run<PadArrayElements>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(PadArrayElementsTest, ArrayAlias_OutOfOrder) {
  auto* src = R"(
fn f() {
  var arr : Array;
  arr = Array();
  arr = Array(1, 2, 3, 4);
  let vals : Array = Array(1, 2, 3, 4);
  arr = vals;
  let x = arr[3];
}

type Array = @stride(16) array<i32, 4>;
)";
  auto* expect = R"(
struct tint_padded_array_element {
  @size(16)
  el : i32;
}

fn f() {
  var arr : array<tint_padded_array_element, 4u>;
  arr = array<tint_padded_array_element, 4u>();
  arr = array<tint_padded_array_element, 4u>(tint_padded_array_element(1), tint_padded_array_element(2), tint_padded_array_element(3), tint_padded_array_element(4));
  let vals : array<tint_padded_array_element, 4u> = array<tint_padded_array_element, 4u>(tint_padded_array_element(1), tint_padded_array_element(2), tint_padded_array_element(3), tint_padded_array_element(4));
  arr = vals;
  let x = arr[3].el;
}

type Array = array<tint_padded_array_element, 4u>;
)";

  auto got = Run<PadArrayElements>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(PadArrayElementsTest, ArraysInStruct) {
  auto* src = R"(
struct S {
  a : @stride(8) array<i32, 4>;
  b : @stride(8) array<i32, 8>;
  c : @stride(8) array<i32, 4>;
  d : @stride(12) array<i32, 8>;
};
)";
  auto* expect = R"(
struct tint_padded_array_element {
  @size(8)
  el : i32;
}

struct tint_padded_array_element_1 {
  @size(8)
  el : i32;
}

struct tint_padded_array_element_2 {
  @size(12)
  el : i32;
}

struct S {
  a : array<tint_padded_array_element, 4u>;
  b : array<tint_padded_array_element_1, 8u>;
  c : array<tint_padded_array_element, 4u>;
  d : array<tint_padded_array_element_2, 8u>;
}
)";

  auto got = Run<PadArrayElements>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(PadArrayElementsTest, ArraysOfArraysInStruct) {
  auto* src = R"(
struct S {
  a : @stride(512) array<i32, 4>;
  b : @stride(512) array<@stride(32) array<i32, 4>, 4>;
  c : @stride(512) array<@stride(64) array<@stride(8) array<i32, 4>, 4>, 4>;
};
)";
  auto* expect = R"(
struct tint_padded_array_element {
  @size(512)
  el : i32;
}

struct tint_padded_array_element_2 {
  @size(32)
  el : i32;
}

struct tint_padded_array_element_1 {
  @size(512)
  el : array<tint_padded_array_element_2, 4u>;
}

struct tint_padded_array_element_5 {
  @size(8)
  el : i32;
}

struct tint_padded_array_element_4 {
  @size(64)
  el : array<tint_padded_array_element_5, 4u>;
}

struct tint_padded_array_element_3 {
  @size(512)
  el : array<tint_padded_array_element_4, 4u>;
}

struct S {
  a : array<tint_padded_array_element, 4u>;
  b : array<tint_padded_array_element_1, 4u>;
  c : array<tint_padded_array_element_3, 4u>;
}
)";

  auto got = Run<PadArrayElements>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(PadArrayElementsTest, AccessArraysOfArraysInStruct) {
  auto* src = R"(
struct S {
  a : @stride(512) array<i32, 4>;
  b : @stride(512) array<@stride(32) array<i32, 4>, 4>;
  c : @stride(512) array<@stride(64) array<@stride(8) array<i32, 4>, 4>, 4>;
};

fn f(s : S) -> i32 {
  return s.a[2] + s.b[1][2] + s.c[3][1][2];
}
)";
  auto* expect = R"(
struct tint_padded_array_element {
  @size(512)
  el : i32;
}

struct tint_padded_array_element_2 {
  @size(32)
  el : i32;
}

struct tint_padded_array_element_1 {
  @size(512)
  el : array<tint_padded_array_element_2, 4u>;
}

struct tint_padded_array_element_5 {
  @size(8)
  el : i32;
}

struct tint_padded_array_element_4 {
  @size(64)
  el : array<tint_padded_array_element_5, 4u>;
}

struct tint_padded_array_element_3 {
  @size(512)
  el : array<tint_padded_array_element_4, 4u>;
}

struct S {
  a : array<tint_padded_array_element, 4u>;
  b : array<tint_padded_array_element_1, 4u>;
  c : array<tint_padded_array_element_3, 4u>;
}

fn f(s : S) -> i32 {
  return ((s.a[2].el + s.b[1].el[2].el) + s.c[3].el[1].el[2].el);
}
)";

  auto got = Run<PadArrayElements>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(PadArrayElementsTest, AccessArraysOfArraysInStruct_OutOfOrder) {
  auto* src = R"(
fn f(s : S) -> i32 {
  return s.a[2] + s.b[1][2] + s.c[3][1][2];
}

struct S {
  a : @stride(512) array<i32, 4>;
  b : @stride(512) array<@stride(32) array<i32, 4>, 4>;
  c : @stride(512) array<@stride(64) array<@stride(8) array<i32, 4>, 4>, 4>;
};
)";
  auto* expect = R"(
struct tint_padded_array_element {
  @size(512)
  el : i32;
}

struct tint_padded_array_element_1 {
  @size(32)
  el : i32;
}

struct tint_padded_array_element_2 {
  @size(512)
  el : array<tint_padded_array_element_1, 4u>;
}

struct tint_padded_array_element_3 {
  @size(8)
  el : i32;
}

struct tint_padded_array_element_4 {
  @size(64)
  el : array<tint_padded_array_element_3, 4u>;
}

struct tint_padded_array_element_5 {
  @size(512)
  el : array<tint_padded_array_element_4, 4u>;
}

fn f(s : S) -> i32 {
  return ((s.a[2].el + s.b[1].el[2].el) + s.c[3].el[1].el[2].el);
}

struct S {
  a : array<tint_padded_array_element, 4u>;
  b : array<tint_padded_array_element_2, 4u>;
  c : array<tint_padded_array_element_5, 4u>;
}
)";

  auto got = Run<PadArrayElements>(src);

  EXPECT_EQ(expect, str(got));
}

TEST_F(PadArrayElementsTest, DeclarationOrder) {
  auto* src = R"(
type T0 = i32;

type T1 = @stride(8) array<i32, 1>;

type T2 = i32;

fn f1(a : @stride(8) array<i32, 2>) {
}

type T3 = i32;

fn f2() {
  var v : @stride(8) array<i32, 3>;
}
)";
  auto* expect = R"(
type T0 = i32;

struct tint_padded_array_element {
  @size(8)
  el : i32;
}

type T1 = array<tint_padded_array_element, 1u>;

type T2 = i32;

struct tint_padded_array_element_1 {
  @size(8)
  el : i32;
}

fn f1(a : array<tint_padded_array_element_1, 2u>) {
}

type T3 = i32;

struct tint_padded_array_element_2 {
  @size(8)
  el : i32;
}

fn f2() {
  var v : array<tint_padded_array_element_2, 3u>;
}
)";

  auto got = Run<PadArrayElements>(src);

  EXPECT_EQ(expect, str(got));
}

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