// 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 "src/tint/ast/transform/remove_continue_in_switch.h"
#include "src/tint/ast/transform/test_helper.h"

namespace tint::ast::transform {
namespace {

using RemoveContinueInSwitchTest = TransformTest;

TEST_F(RemoveContinueInSwitchTest, ShouldRun_True) {
    auto* src = R"(
fn f() {
  var i = 0;
  loop {
    switch(i) {
      case 0: {
        continue;
        break;
      }
      default: {
        break;
      }
    }
    break;
  }
}
)";

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

TEST_F(RemoveContinueInSwitchTest, ShouldRunEmptyModule_False) {
    auto* src = "";

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

TEST_F(RemoveContinueInSwitchTest, ShouldRunContinueNotInSwitch_False) {
    auto* src = R"(
fn f() {
  var i = 0;
  loop {
    switch(i) {
      case 0: {
        break;
      }
      default: {
        break;
      }
    }

    if (true) {
      continue;
    }
    break;
  }
}
)";

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

TEST_F(RemoveContinueInSwitchTest, ShouldRunContinueInLoopInSwitch_False) {
    auto* src = R"(
fn f() {
  var i = 0;
  switch(i) {
    case 0: {
      loop {
        if (true) {
          continue;
        }
        break;
      }
      break;
    }
    default: {
      break;
    }
  }
}
)";

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

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

    Transform::DataMap data;
    auto got = Run<RemoveContinueInSwitch>(src, data);

    EXPECT_EQ(expect, str(got));
}

TEST_F(RemoveContinueInSwitchTest, SingleContinue) {
    auto* src = R"(
fn f() {
  var i = 0;
  loop {
    let marker1 = 0;
    switch(i) {
      case 0: {
        continue;
        break;
      }
      default: {
        break;
      }
    }
    let marker2 = 0;
    break;

    continuing {
      let marker3 = 0;
    }
  }
}
)";

    auto* expect = R"(
fn f() {
  var i = 0;
  loop {
    let marker1 = 0;
    var tint_continue : bool = false;
    switch(i) {
      case 0: {
        {
          tint_continue = true;
          break;
        }
        break;
      }
      default: {
        break;
      }
    }
    if (tint_continue) {
      continue;
    }
    let marker2 = 0;
    break;

    continuing {
      let marker3 = 0;
    }
  }
}
)";

    Transform::DataMap data;
    auto got = Run<RemoveContinueInSwitch>(src, data);

    EXPECT_EQ(expect, str(got));
}

TEST_F(RemoveContinueInSwitchTest, MultipleContinues) {
    auto* src = R"(
fn f() {
  var i = 0;
  loop {
    let marker1 = 0;
    switch(i) {
      case 0: {
        continue;
        break;
      }
      case 1: {
        continue;
        break;
      }
      case 2: {
        continue;
        break;
      }
      default: {
        break;
      }
    }
    let marker2 = 0;
    break;

    continuing {
      let marker3 = 0;
    }
  }
}
)";

    auto* expect = R"(
fn f() {
  var i = 0;
  loop {
    let marker1 = 0;
    var tint_continue : bool = false;
    switch(i) {
      case 0: {
        {
          tint_continue = true;
          break;
        }
        break;
      }
      case 1: {
        {
          tint_continue = true;
          break;
        }
        break;
      }
      case 2: {
        {
          tint_continue = true;
          break;
        }
        break;
      }
      default: {
        break;
      }
    }
    if (tint_continue) {
      continue;
    }
    let marker2 = 0;
    break;

    continuing {
      let marker3 = 0;
    }
  }
}
)";

    Transform::DataMap data;
    auto got = Run<RemoveContinueInSwitch>(src, data);

    EXPECT_EQ(expect, str(got));
}

TEST_F(RemoveContinueInSwitchTest, MultipleSwitch) {
    auto* src = R"(
fn f() {
  var i = 0;
  loop {
    let marker1 = 0;
    switch(i) {
      case 0: {
        continue;
        break;
      }
      default: {
        break;
      }
    }
    let marker2 = 0;

    let marker3 = 0;
    switch(i) {
      case 0: {
        continue;
        break;
      }
      default: {
        break;
      }
    }
    let marker4 = 0;

    break;
  }
}
)";

    auto* expect = R"(
fn f() {
  var i = 0;
  loop {
    let marker1 = 0;
    var tint_continue : bool = false;
    switch(i) {
      case 0: {
        {
          tint_continue = true;
          break;
        }
        break;
      }
      default: {
        break;
      }
    }
    if (tint_continue) {
      continue;
    }
    let marker2 = 0;
    let marker3 = 0;
    var tint_continue_1 : bool = false;
    switch(i) {
      case 0: {
        {
          tint_continue_1 = true;
          break;
        }
        break;
      }
      default: {
        break;
      }
    }
    if (tint_continue_1) {
      continue;
    }
    let marker4 = 0;
    break;
  }
}
)";

    Transform::DataMap data;
    auto got = Run<RemoveContinueInSwitch>(src, data);

    EXPECT_EQ(expect, str(got));
}

TEST_F(RemoveContinueInSwitchTest, NestedLoopSwitch) {
    auto* src = R"(
fn f() {
  var i = 0;
  loop {
    let marker1 = 0;
    switch(i) {
      case 0: {
        var j = 0;
        loop {
          let marker3 = 0;
          switch(j) {
            case 0: {
              continue;
              break;
            }
            default: {
              break;
            }
          }
          let marker4 = 0;
          break;
        }
        continue;
        break;
      }
      default: {
        break;
      }
    }
    let marker2 = 0;
    break;
  }
}
)";

    auto* expect = R"(
fn f() {
  var i = 0;
  loop {
    let marker1 = 0;
    var tint_continue_1 : bool = false;
    switch(i) {
      case 0: {
        var j = 0;
        loop {
          let marker3 = 0;
          var tint_continue : bool = false;
          switch(j) {
            case 0: {
              {
                tint_continue = true;
                break;
              }
              break;
            }
            default: {
              break;
            }
          }
          if (tint_continue) {
            continue;
          }
          let marker4 = 0;
          break;
        }
        {
          tint_continue_1 = true;
          break;
        }
        break;
      }
      default: {
        break;
      }
    }
    if (tint_continue_1) {
      continue;
    }
    let marker2 = 0;
    break;
  }
}
)";

    Transform::DataMap data;
    auto got = Run<RemoveContinueInSwitch>(src, data);

    EXPECT_EQ(expect, str(got));
}

TEST_F(RemoveContinueInSwitchTest, ExtraScopes) {
    auto* src = R"(
fn f() {
  var i = 0;
  var a = true;
  var b = true;
  var c = true;
  var d = true;
  loop {
    if (a) {
      if (b) {
        let marker1 = 0;
        switch(i) {
          case 0: {
            if (c) {
              if (d) {
                continue;
              }
            }
            break;
          }
          default: {
            break;
          }
        }
        let marker2 = 0;
        break;
      }
    }
  }
}
)";

    auto* expect = R"(
fn f() {
  var i = 0;
  var a = true;
  var b = true;
  var c = true;
  var d = true;
  loop {
    if (a) {
      if (b) {
        let marker1 = 0;
        var tint_continue : bool = false;
        switch(i) {
          case 0: {
            if (c) {
              if (d) {
                {
                  tint_continue = true;
                  break;
                }
              }
            }
            break;
          }
          default: {
            break;
          }
        }
        if (tint_continue) {
          continue;
        }
        let marker2 = 0;
        break;
      }
    }
  }
}
)";

    Transform::DataMap data;
    auto got = Run<RemoveContinueInSwitch>(src, data);

    EXPECT_EQ(expect, str(got));
}

TEST_F(RemoveContinueInSwitchTest, ForLoop) {
    auto* src = R"(
fn f() {
  for (var i = 0; i < 4; i = i + 1) {
    let marker1 = 0;
    switch(i) {
      case 0: {
        continue;
        break;
      }
      default: {
        break;
      }
    }
    let marker2 = 0;
    break;
  }
}
)";

    auto* expect = R"(
fn f() {
  for(var i = 0; (i < 4); i = (i + 1)) {
    let marker1 = 0;
    var tint_continue : bool = false;
    switch(i) {
      case 0: {
        {
          tint_continue = true;
          break;
        }
        break;
      }
      default: {
        break;
      }
    }
    if (tint_continue) {
      continue;
    }
    let marker2 = 0;
    break;
  }
}
)";

    Transform::DataMap data;
    auto got = Run<RemoveContinueInSwitch>(src, data);

    EXPECT_EQ(expect, str(got));
}

TEST_F(RemoveContinueInSwitchTest, While) {
    auto* src = R"(
fn f() {
  var i = 0;
  while (i < 4) {
    let marker1 = 0;
    switch(i) {
      case 0: {
        continue;
        break;
      }
      default: {
        break;
      }
    }
    let marker2 = 0;
    break;
  }
}
)";

    auto* expect = R"(
fn f() {
  var i = 0;
  while((i < 4)) {
    let marker1 = 0;
    var tint_continue : bool = false;
    switch(i) {
      case 0: {
        {
          tint_continue = true;
          break;
        }
        break;
      }
      default: {
        break;
      }
    }
    if (tint_continue) {
      continue;
    }
    let marker2 = 0;
    break;
  }
}
)";

    Transform::DataMap data;
    auto got = Run<RemoveContinueInSwitch>(src, data);

    EXPECT_EQ(expect, str(got));
}

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