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

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

namespace tint::transform {
namespace {

using ForLoopToLoopTest = TransformTest;

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

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

TEST_F(ForLoopToLoopTest, ShouldRunHasForLoop) {
    auto* src = R"(
fn f() {
  for (;;) {
    break;
  }
}
)";

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

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

    auto got = Run<ForLoopToLoop>(src);

    EXPECT_EQ(expect, str(got));
}

// Test an empty for loop.
TEST_F(ForLoopToLoopTest, Empty) {
    auto* src = R"(
fn f() {
  for (;;) {
    break;
  }
}
)";

    auto* expect = R"(
fn f() {
  loop {
    break;
  }
}
)";

    auto got = Run<ForLoopToLoop>(src);

    EXPECT_EQ(expect, str(got));
}

// Test a for loop with non-empty body.
TEST_F(ForLoopToLoopTest, Body) {
    auto* src = R"(
fn f() {
  for (;;) {
    discard;
  }
}
)";

    auto* expect = R"(
fn f() {
  loop {
    discard;
  }
}
)";

    auto got = Run<ForLoopToLoop>(src);

    EXPECT_EQ(expect, str(got));
}

// Test a for loop declaring a variable in the initializer statement.
TEST_F(ForLoopToLoopTest, InitializerStatementDecl) {
    auto* src = R"(
fn f() {
  for (var i: i32;;) {
    break;
  }
}
)";

    auto* expect = R"(
fn f() {
  {
    var i : i32;
    loop {
      break;
    }
  }
}
)";

    auto got = Run<ForLoopToLoop>(src);

    EXPECT_EQ(expect, str(got));
}

// Test a for loop declaring and initializing a variable in the initializer
// statement.
TEST_F(ForLoopToLoopTest, InitializerStatementDeclEqual) {
    auto* src = R"(
fn f() {
  for (var i: i32 = 0;;) {
    break;
  }
}
)";

    auto* expect = R"(
fn f() {
  {
    var i : i32 = 0;
    loop {
      break;
    }
  }
}
)";

    auto got = Run<ForLoopToLoop>(src);

    EXPECT_EQ(expect, str(got));
}

// Test a for loop declaring a const variable in the initializer statement.
TEST_F(ForLoopToLoopTest, InitializerStatementConstDecl) {
    auto* src = R"(
fn f() {
  for (let i: i32 = 0;;) {
    break;
  }
}
)";

    auto* expect = R"(
fn f() {
  {
    let i : i32 = 0;
    loop {
      break;
    }
  }
}
)";

    auto got = Run<ForLoopToLoop>(src);

    EXPECT_EQ(expect, str(got));
}

// Test a for loop assigning a variable in the initializer statement.
TEST_F(ForLoopToLoopTest, InitializerStatementAssignment) {
    auto* src = R"(
fn f() {
  var i: i32;
  for (i = 0;;) {
    break;
  }
}
)";

    auto* expect = R"(
fn f() {
  var i : i32;
  {
    i = 0;
    loop {
      break;
    }
  }
}
)";

    auto got = Run<ForLoopToLoop>(src);

    EXPECT_EQ(expect, str(got));
}

// Test a for loop calling a function in the initializer statement.
TEST_F(ForLoopToLoopTest, InitializerStatementFuncCall) {
    auto* src = R"(
fn a(x : i32, y : i32) {
}

fn f() {
  var b : i32;
  var c : i32;
  for (a(b,c);;) {
    break;
  }
}
)";

    auto* expect = R"(
fn a(x : i32, y : i32) {
}

fn f() {
  var b : i32;
  var c : i32;
  {
    a(b, c);
    loop {
      break;
    }
  }
}
)";

    auto got = Run<ForLoopToLoop>(src);

    EXPECT_EQ(expect, str(got));
}

// Test a for loop with a break condition
TEST_F(ForLoopToLoopTest, BreakCondition) {
    auto* src = R"(
fn f() {
  for (; 0 == 1;) {
  }
}
)";

    auto* expect = R"(
fn f() {
  loop {
    if (!((0 == 1))) {
      break;
    }
  }
}
)";

    auto got = Run<ForLoopToLoop>(src);

    EXPECT_EQ(expect, str(got));
}

// Test a for loop assigning a variable in the continuing statement.
TEST_F(ForLoopToLoopTest, ContinuingAssignment) {
    auto* src = R"(
fn f() {
  var x: i32;
  for (;;x = 2) {
    break;
  }
}
)";

    auto* expect = R"(
fn f() {
  var x : i32;
  loop {
    break;

    continuing {
      x = 2;
    }
  }
}
)";

    auto got = Run<ForLoopToLoop>(src);

    EXPECT_EQ(expect, str(got));
}

// Test a for loop calling a function in the continuing statement.
TEST_F(ForLoopToLoopTest, ContinuingFuncCall) {
    auto* src = R"(
fn a(x : i32, y : i32) {
}

fn f() {
  var b : i32;
  var c : i32;
  for (;;a(b,c)) {
    break;
  }
}
)";

    auto* expect = R"(
fn a(x : i32, y : i32) {
}

fn f() {
  var b : i32;
  var c : i32;
  loop {
    break;

    continuing {
      a(b, c);
    }
  }
}
)";

    auto got = Run<ForLoopToLoop>(src);

    EXPECT_EQ(expect, str(got));
}

// Test a for loop with all statements non-empty.
TEST_F(ForLoopToLoopTest, All) {
    auto* src = R"(
fn f() {
  var a : i32;
  for(var i : i32 = 0; i < 4; i = i + 1) {
    if (a == 0) {
      continue;
    }
    a = a + 2;
  }
}
)";

    auto* expect = R"(
fn f() {
  var a : i32;
  {
    var i : i32 = 0;
    loop {
      if (!((i < 4))) {
        break;
      }
      if ((a == 0)) {
        continue;
      }
      a = (a + 2);

      continuing {
        i = (i + 1);
      }
    }
  }
}
)";

    auto got = Run<ForLoopToLoop>(src);

    EXPECT_EQ(expect, str(got));
}

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