// Copyright 2020 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/transform/bound_array_accessors.h"

#include "src/transform/test_helper.h"

namespace tint {
namespace transform {
namespace {

using BoundArrayAccessorsTest = TransformTest;

TEST_F(BoundArrayAccessorsTest, Ptrs_Clamp) {
  auto* src = R"(
var a : array<f32, 3>;

const c : u32 = 1u;

fn f() -> void {
  const b : ptr<function, f32> = a[c];
}
)";

  auto* expect = R"(
var a : array<f32, 3>;

const c : u32 = 1u;

fn f() -> void {
  const b : ptr<function, f32> = a[min(u32(c), 2u)];
}
)";

  auto got = Transform<BoundArrayAccessors>(src);

  EXPECT_EQ(expect, got);
}

TEST_F(BoundArrayAccessorsTest, Array_Idx_Nested_Scalar) {
  auto* src = R"(
var a : array<f32, 3>;

var b : array<f32, 5>;

var i : u32;

fn f() -> void {
  var c : f32 = a[ b[i] ];
}
)";

  auto* expect = R"(
var a : array<f32, 3>;

var b : array<f32, 5>;

var i : u32;

fn f() -> void {
  var c : f32 = a[min(u32(b[min(u32(i), 4u)]), 2u)];
}
)";

  auto got = Transform<BoundArrayAccessors>(src);

  EXPECT_EQ(expect, got);
}

TEST_F(BoundArrayAccessorsTest, Array_Idx_Scalar) {
  auto* src = R"(
var a : array<f32, 3>;

fn f() -> void {
  var b : f32 = a[1];
}
)";

  auto* expect = R"(
var a : array<f32, 3>;

fn f() -> void {
  var b : f32 = a[1];
}
)";

  auto got = Transform<BoundArrayAccessors>(src);

  EXPECT_EQ(expect, got);
}

TEST_F(BoundArrayAccessorsTest, Array_Idx_Expr) {
  auto* src = R"(
var a : array<f32, 3>;

var c : u32;

fn f() -> void {
  var b : f32 = a[c + 2 - 3];
}
)";

  auto* expect = R"(
var a : array<f32, 3>;

var c : u32;

fn f() -> void {
  var b : f32 = a[min(u32(((c + 2) - 3)), 2u)];
}
)";

  auto got = Transform<BoundArrayAccessors>(src);

  EXPECT_EQ(expect, got);
}

TEST_F(BoundArrayAccessorsTest, Array_Idx_Negative) {
  auto* src = R"(
var a : array<f32, 3>;

fn f() -> void {
  var b : f32 = a[-1];
}
)";

  auto* expect = R"(
var a : array<f32, 3>;

fn f() -> void {
  var b : f32 = a[0];
}
)";

  auto got = Transform<BoundArrayAccessors>(src);

  EXPECT_EQ(expect, got);
}

TEST_F(BoundArrayAccessorsTest, Array_Idx_OutOfBounds) {
  auto* src = R"(
var a : array<f32, 3>;

fn f() -> void {
  var b : f32 = a[3];
}
)";

  auto* expect = R"(
var a : array<f32, 3>;

fn f() -> void {
  var b : f32 = a[2];
}
)";

  auto got = Transform<BoundArrayAccessors>(src);

  EXPECT_EQ(expect, got);
}

TEST_F(BoundArrayAccessorsTest, Vector_Idx_Scalar) {
  auto* src = R"(
var a : vec3<f32>;

fn f() -> void {
  var b : f32 = a[1];
}
)";

  auto* expect = R"(
var a : vec3<f32>;

fn f() -> void {
  var b : f32 = a[1];
}
)";

  auto got = Transform<BoundArrayAccessors>(src);

  EXPECT_EQ(expect, got);
}

TEST_F(BoundArrayAccessorsTest, Vector_Idx_Expr) {
  auto* src = R"(
var a : vec3<f32>;

var c : u32;

fn f() -> void {
  var b : f32 = a[c + 2 - 3];
}
)";

  auto* expect = R"(
var a : vec3<f32>;

var c : u32;

fn f() -> void {
  var b : f32 = a[min(u32(((c + 2) - 3)), 2u)];
}
)";

  auto got = Transform<BoundArrayAccessors>(src);

  EXPECT_EQ(expect, got);
}

TEST_F(BoundArrayAccessorsTest, Vector_Idx_Negative) {
  auto* src = R"(
var a : vec3<f32>;

fn f() -> void {
  var b : f32 = a[-1];
}
)";

  auto* expect = R"(
var a : vec3<f32>;

fn f() -> void {
  var b : f32 = a[0];
}
)";

  auto got = Transform<BoundArrayAccessors>(src);

  EXPECT_EQ(expect, got);
}

TEST_F(BoundArrayAccessorsTest, Vector_Idx_OutOfBounds) {
  auto* src = R"(
var a : vec3<f32>;

fn f() -> void {
  var b : f32 = a[3];
}
)";

  auto* expect = R"(
var a : vec3<f32>;

fn f() -> void {
  var b : f32 = a[2];
}
)";

  auto got = Transform<BoundArrayAccessors>(src);

  EXPECT_EQ(expect, got);
}

TEST_F(BoundArrayAccessorsTest, Matrix_Idx_Scalar) {
  auto* src = R"(
var a : mat3x2<f32>;

fn f() -> void {
  var b : f32 = a[2][1];
}
)";

  auto* expect = R"(
var a : mat3x2<f32>;

fn f() -> void {
  var b : f32 = a[2][1];
}
)";

  auto got = Transform<BoundArrayAccessors>(src);

  EXPECT_EQ(expect, got);
}

TEST_F(BoundArrayAccessorsTest, Matrix_Idx_Expr_Column) {
  auto* src = R"(
var a : mat3x2<f32>;

var c : u32;

fn f() -> void {
  var b : f32 = a[c + 2 - 3][1];
}
)";

  auto* expect = R"(
var a : mat3x2<f32>;

var c : u32;

fn f() -> void {
  var b : f32 = a[min(u32(((c + 2) - 3)), 2u)][1];
}
)";

  auto got = Transform<BoundArrayAccessors>(src);

  EXPECT_EQ(expect, got);
}

TEST_F(BoundArrayAccessorsTest, Matrix_Idx_Expr_Row) {
  auto* src = R"(
var a : mat3x2<f32>;

var c : u32;

fn f() -> void {
  var b : f32 = a[1][c + 2 - 3];
}
)";

  auto* expect = R"(
var a : mat3x2<f32>;

var c : u32;

fn f() -> void {
  var b : f32 = a[1][min(u32(((c + 2) - 3)), 1u)];
}
)";

  auto got = Transform<BoundArrayAccessors>(src);

  EXPECT_EQ(expect, got);
}

TEST_F(BoundArrayAccessorsTest, Matrix_Idx_Negative_Column) {
  auto* src = R"(
var a : mat3x2<f32>;

fn f() -> void {
  var b : f32 = a[-1][1];
}
)";

  auto* expect = R"(
var a : mat3x2<f32>;

fn f() -> void {
  var b : f32 = a[0][1];
}
)";

  auto got = Transform<BoundArrayAccessors>(src);

  EXPECT_EQ(expect, got);
}

TEST_F(BoundArrayAccessorsTest, Matrix_Idx_Negative_Row) {
  auto* src = R"(
var a : mat3x2<f32>;

fn f() -> void {
  var b : f32 = a[2][-1];
}
)";

  auto* expect = R"(
var a : mat3x2<f32>;

fn f() -> void {
  var b : f32 = a[2][0];
}
)";

  auto got = Transform<BoundArrayAccessors>(src);

  EXPECT_EQ(expect, got);
}

TEST_F(BoundArrayAccessorsTest, Matrix_Idx_OutOfBounds_Column) {
  auto* src = R"(
var a : mat3x2<f32>;

fn f() -> void {
  var b : f32 = a[5][1];
}
)";

  auto* expect = R"(
var a : mat3x2<f32>;

fn f() -> void {
  var b : f32 = a[2][1];
}
)";

  auto got = Transform<BoundArrayAccessors>(src);

  EXPECT_EQ(expect, got);
}

TEST_F(BoundArrayAccessorsTest, Matrix_Idx_OutOfBounds_Row) {
  auto* src = R"(
var a : mat3x2<f32>;

fn f() -> void {
  var b : f32 = a[2][5];
}
)";

  auto* expect = R"(
var a : mat3x2<f32>;

fn f() -> void {
  var b : f32 = a[2][1];
}
)";

  auto got = Transform<BoundArrayAccessors>(src);

  EXPECT_EQ(expect, got);
}

// TODO(dsinclair): Implement when constant_id exists
TEST_F(BoundArrayAccessorsTest, DISABLED_Vector_Constant_Id_Clamps) {
  // [[constant_id(1300)]] const idx : i32;
  // var a : vec3<f32>
  // var b : f32 = a[idx]
  //
  // ->var b : f32 = a[min(u32(idx), 2)]
}

// TODO(dsinclair): Implement when constant_id exists
TEST_F(BoundArrayAccessorsTest, DISABLED_Array_Constant_Id_Clamps) {
  // [[constant_id(1300)]] const idx : i32;
  // var a : array<f32, 4>
  // var b : f32 = a[idx]
  //
  // -> var b : f32 = a[min(u32(idx), 3)]
}

// TODO(dsinclair): Implement when constant_id exists
TEST_F(BoundArrayAccessorsTest, DISABLED_Matrix_Column_Constant_Id_Clamps) {
  // [[constant_id(1300)]] const idx : i32;
  // var a : mat3x2<f32>
  // var b : f32 = a[idx][1]
  //
  // -> var b : f32 = a[min(u32(idx), 2)][1]
}

// TODO(dsinclair): Implement when constant_id exists
TEST_F(BoundArrayAccessorsTest, DISABLED_Matrix_Row_Constant_Id_Clamps) {
  // [[constant_id(1300)]] const idx : i32;
  // var a : mat3x2<f32>
  // var b : f32 = a[1][idx]
  //
  // -> var b : f32 = a[1][min(u32(idx), 0, 1)]
}

TEST_F(BoundArrayAccessorsTest, RuntimeArray_Clamps) {
  auto* src = R"(
struct S {
  a : f32;
  b : array<f32>;
};
var s : S;

fn f() -> void {
  var d : f32 = s.b[25];
}
)";

  auto* expect = R"(
struct S {
  a : f32;
  b : array<f32>;
};

var s : S;

fn f() -> void {
  var d : f32 = s.b[min(u32(25), (arrayLength(s.b) - 1u))];
}
)";

  auto got = Transform<BoundArrayAccessors>(src);

  EXPECT_EQ(expect, got);
}

// TODO(dsinclair): Clamp atomics when available.
TEST_F(BoundArrayAccessorsTest, DISABLED_Atomics_Clamp) {
  FAIL();
}

// TODO(dsinclair): Clamp texture coord values. Depends on:
// https://github.com/gpuweb/gpuweb/issues/1107
TEST_F(BoundArrayAccessorsTest, DISABLED_TextureCoord_Clamp) {
  FAIL();
}

// TODO(dsinclair): Test for scoped variables when Lexical Scopes implemented
TEST_F(BoundArrayAccessorsTest, DISABLED_Scoped_Variable) {
  // var a : array<f32, 3>;
  // var i : u32;
  // {
  //    var a : array<f32, 5>;
  //    var b : f32 = a[i];
  // }
  // var c : f32 = a[i];
  //
  // -> var b : f32 = a[min(u32(i), 4)];
  //    var c : f32 = a[min(u32(i), 2)];
  FAIL();
}

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