// 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/fuzzers/tint_ast_fuzzer/mutations/delete_statement.h"

#include <functional>
#include <string>

#include "gtest/gtest.h"

#include "src/tint/ast/assignment_statement.h"
#include "src/tint/ast/block_statement.h"
#include "src/tint/ast/case_statement.h"
#include "src/tint/ast/fallthrough_statement.h"
#include "src/tint/ast/for_loop_statement.h"
#include "src/tint/ast/if_statement.h"
#include "src/tint/ast/switch_statement.h"
#include "src/tint/fuzzers/tint_ast_fuzzer/mutator.h"
#include "src/tint/fuzzers/tint_ast_fuzzer/node_id_map.h"
#include "src/tint/fuzzers/tint_ast_fuzzer/probability_context.h"
#include "src/tint/program_builder.h"
#include "src/tint/reader/wgsl/parser.h"
#include "src/tint/writer/wgsl/generator.h"

namespace tint::fuzzers::ast_fuzzer {
namespace {

void CheckStatementDeletionWorks(
    const std::string& original,
    const std::string& expected,
    const std::function<const ast::Statement*(const Program&)>& statement_finder) {
    Source::File original_file("original.wgsl", original);
    auto program = reader::wgsl::Parse(&original_file);

    Source::File expected_file("expected.wgsl", expected);
    auto expected_program = reader::wgsl::Parse(&expected_file);

    ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();
    ASSERT_TRUE(expected_program.IsValid()) << expected_program.Diagnostics().str();

    NodeIdMap node_id_map(program);
    const auto* statement = statement_finder(program);
    ASSERT_NE(statement, nullptr);
    auto statement_id = node_id_map.GetId(statement);
    ASSERT_NE(statement_id, 0);
    ASSERT_TRUE(MaybeApplyMutation(program, MutationDeleteStatement(statement_id), node_id_map,
                                   &program, &node_id_map, nullptr));
    ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();
    writer::wgsl::Options options;
    auto transformed_result = writer::wgsl::Generate(&program, options);
    auto expected_result = writer::wgsl::Generate(&expected_program, options);
    ASSERT_TRUE(transformed_result.success) << transformed_result.error;
    ASSERT_TRUE(expected_result.success) << expected_result.error;
    ASSERT_EQ(expected_result.wgsl, transformed_result.wgsl);
}

void CheckStatementDeletionNotAllowed(
    const std::string& original,
    const std::function<const ast::Statement*(const Program&)>& statement_finder) {
    Source::File original_file("original.wgsl", original);
    auto program = reader::wgsl::Parse(&original_file);

    ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();

    NodeIdMap node_id_map(program);
    const auto* statement = statement_finder(program);
    ASSERT_NE(statement, nullptr);
    auto statement_id = node_id_map.GetId(statement);
    ASSERT_NE(statement_id, 0);
    ASSERT_FALSE(MaybeApplyMutation(program, MutationDeleteStatement(statement_id), node_id_map,
                                    &program, &node_id_map, nullptr));
}

TEST(DeleteStatementTest, DeleteAssignStatement) {
    auto original = R"(
    fn main() {
      {
        var a : i32 = 5;
        a = 6;
      }
    })";
    auto expected = R"(fn main() {
  {
    var a : i32 = 5;
  }
}
)";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST()
            .Functions()[0]
            ->body->statements[0]
            ->As<ast::BlockStatement>()
            ->statements[1]
            ->As<ast::AssignmentStatement>();
    };
    CheckStatementDeletionWorks(original, expected, statement_finder);
}

TEST(DeleteStatementTest, DeleteForStatement) {
    auto original =
        R"(
    fn main() {
      for (var i : i32 = 0; i < 10; i++) {
      }
    }
  )";
    auto expected = "fn main() { }";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST().Functions()[0]->body->statements[0]->As<ast::ForLoopStatement>();
    };
    CheckStatementDeletionWorks(original, expected, statement_finder);
}

TEST(DeleteStatementTest, DeleteIfStatement) {
    auto original =
        R"(
    fn main() {
      if (true) { } else { }
    }
  )";
    auto expected = "fn main() { }";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST().Functions()[0]->body->statements[0]->As<ast::IfStatement>();
    };
    CheckStatementDeletionWorks(original, expected, statement_finder);
}

TEST(DeleteStatementTest, DeleteBlockStatement) {
    auto original = "fn main() { { } }";
    auto expected = "fn main() { }";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST().Functions()[0]->body->statements[0]->As<ast::BlockStatement>();
    };
    CheckStatementDeletionWorks(original, expected, statement_finder);
}

TEST(DeleteStatementTest, DeleteSwitchStatement) {
    auto original = R"(
fn main() {
  switch(1) {
    case 0, 1: {
    }
    default: {
      fallthrough;
    }
    case 2: {
    }
  }
})";
    auto expected = R"(fn main() { })";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST().Functions()[0]->body->statements[0]->As<ast::SwitchStatement>();
    };
    CheckStatementDeletionWorks(original, expected, statement_finder);
}

TEST(DeleteStatementTest, DeleteCaseStatement) {
    auto original = R"(
fn main() {
  switch(1) {
    case 0, 1: {
    }
    default: {
      fallthrough;
    }
    case 2: {
    }
  }
})";
    auto expected = R"(
fn main() {
  switch(1) {
    default: {
      fallthrough;
    }
    case 2: {
    }
  }
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST()
            .Functions()[0]
            ->body->statements[0]
            ->As<ast::SwitchStatement>()
            ->body[0]
            ->As<ast::CaseStatement>();
    };
    CheckStatementDeletionWorks(original, expected, statement_finder);
}

TEST(DeleteStatementTest, DeleteFallthroughStatement) {
    auto original = R"(
fn main() {
  switch(1) {
    case 0, 1: {
    }
    default: {
      fallthrough;
    }
    case 2: {
    }
  }
})";
    auto expected = R"(
fn main() {
  switch(1) {
    case 0, 1: {
    }
    default: {
    }
    case 2: {
    }
  }
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST()
            .Functions()[0]
            ->body->statements[0]
            ->As<ast::SwitchStatement>()
            ->body[1]
            ->As<ast::CaseStatement>()
            ->body->statements[0]
            ->As<ast::FallthroughStatement>();
    };
    CheckStatementDeletionWorks(original, expected, statement_finder);
}

TEST(DeleteStatementTest, DeleteElse) {
    auto original = R"(
fn main() {
  if (true) {
  } else {
  }
})";
    auto expected = R"(
fn main() {
  if (true) {
  }
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST()
            .Functions()[0]
            ->body->statements[0]
            ->As<ast::IfStatement>()
            ->else_statement;
    };
    CheckStatementDeletionWorks(original, expected, statement_finder);
}

TEST(DeleteStatementTest, DeleteCall) {
    auto original = R"(
fn main() {
  sin(1.0);
})";
    auto expected = R"(
fn main() {
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST().Functions()[0]->body->statements[0]->As<ast::CallStatement>();
    };
    CheckStatementDeletionWorks(original, expected, statement_finder);
}

TEST(DeleteStatementTest, DeleteCompoundAssign) {
    auto original = R"(
fn main() {
  var x : i32 = 0;
  x += 2;;
})";
    auto expected = R"(
fn main() {
  var x : i32 = 0;
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST()
            .Functions()[0]
            ->body->statements[1]
            ->As<ast::CompoundAssignmentStatement>();
    };
    CheckStatementDeletionWorks(original, expected, statement_finder);
}

TEST(DeleteStatementTest, DeleteLoop) {
    auto original = R"(
fn main() {
  var x : i32 = 0;
  loop {
    if (x > 100) {
      break;
    }
    continuing {
      x++;
    }
  }
})";
    auto expected = R"(
fn main() {
  var x : i32 = 0;
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST().Functions()[0]->body->statements[1]->As<ast::LoopStatement>();
    };
    CheckStatementDeletionWorks(original, expected, statement_finder);
}

TEST(DeleteStatementTest, DeleteContinuingBlock) {
    auto original = R"(
fn main() {
  var x : i32 = 0;
  loop {
    if (x > 100) {
      break;
    }
    continuing {
      x++;
    }
  }
})";
    auto expected = R"(
fn main() {
  var x : i32 = 0;
  loop {
    if (x > 100) {
      break;
    }
  }
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST()
            .Functions()[0]
            ->body->statements[1]
            ->As<ast::LoopStatement>()
            ->continuing;
    };
    CheckStatementDeletionWorks(original, expected, statement_finder);
}

TEST(DeleteStatementTest, DeleteContinue) {
    auto original = R"(
fn main() {
  var x : i32 = 0;
  loop {
    if (x > 100) {
      break;
    }
    continue;
    continuing {
      x++;
    }
  }
})";
    auto expected = R"(
fn main() {
  var x : i32 = 0;
  loop {
    if (x > 100) {
      break;
    }
    continuing {
      x++;
    }
  }
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST()
            .Functions()[0]
            ->body->statements[1]
            ->As<ast::LoopStatement>()
            ->body->statements[1]
            ->As<ast::ContinueStatement>();
    };
    CheckStatementDeletionWorks(original, expected, statement_finder);
}

TEST(DeleteStatementTest, DeleteIncrement) {
    auto original = R"(
fn main() {
  var x : i32 = 0;
  loop {
    if (x > 100) {
      break;
    }
    continuing {
      x++;
    }
  }
})";
    auto expected = R"(
fn main() {
  var x : i32 = 0;
  loop {
    if (x > 100) {
      break;
    }
    continuing {
    }
  }
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST()
            .Functions()[0]
            ->body->statements[1]
            ->As<ast::LoopStatement>()
            ->continuing->statements[0]
            ->As<ast::IncrementDecrementStatement>();
    };
    CheckStatementDeletionWorks(original, expected, statement_finder);
}

TEST(DeleteStatementTest, DeleteForLoopInitializer) {
    auto original = R"(
fn main() {
  var x : i32;
  for (x = 0; x < 100; x++) {
  }
})";
    auto expected = R"(
fn main() {
  var x : i32;
  for (; x < 100; x++) {
  }
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST()
            .Functions()[0]
            ->body->statements[1]
            ->As<ast::ForLoopStatement>()
            ->initializer->As<ast::AssignmentStatement>();
    };
    CheckStatementDeletionWorks(original, expected, statement_finder);
}

TEST(DeleteStatementTest, DeleteForLoopContinuing) {
    auto original = R"(
fn main() {
  var x : i32;
  for (x = 0; x < 100; x++) {
  }
})";
    auto expected = R"(
fn main() {
  var x : i32;
  for (x = 0; x < 100;) {
  }
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST()
            .Functions()[0]
            ->body->statements[1]
            ->As<ast::ForLoopStatement>()
            ->continuing->As<ast::IncrementDecrementStatement>();
    };
    CheckStatementDeletionWorks(original, expected, statement_finder);
}

TEST(DeleteStatementTest, AllowDeletionOfInnerLoopWithBreak) {
    auto original = R"(
fn main() {
  loop {
    loop {
      break;
    }
    break;
  }
})";
    auto expected = R"(
fn main() {
  loop {
    break;
  }
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST()
            .Functions()[0]
            ->body->statements[0]
            ->As<ast::LoopStatement>()
            ->body->statements[0]
            ->As<ast::LoopStatement>();
    };
    CheckStatementDeletionWorks(original, expected, statement_finder);
}

TEST(DeleteStatementTest, AllowDeletionOfInnerCaseWithBreak) {
    auto original = R"(
fn main() {
  loop {
    switch(0) {
      case 1: {
        break;
      }
      default: {
      }
    }
    break;
  }
})";
    auto expected = R"(
fn main() {
  loop {
    switch(0) {
      default: {
      }
    }
    break;
  }
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST()
            .Functions()[0]
            ->body->statements[0]
            ->As<ast::LoopStatement>()
            ->body->statements[0]
            ->As<ast::SwitchStatement>()
            ->body[0];
    };
    CheckStatementDeletionWorks(original, expected, statement_finder);
}

TEST(DeleteStatementTest, AllowDeletionOfBreakFromSwitch) {
    auto original = R"(
fn main() {
  switch(0) {
    case 1: {
      break;
    }
    default: {
    }
  }
})";
    auto expected = R"(
fn main() {
  switch(0) {
    case 1: {
    }
    default: {
    }
  }
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST()
            .Functions()[0]
            ->body->statements[0]
            ->As<ast::SwitchStatement>()
            ->body[0]
            ->body->statements[0]
            ->As<ast::BreakStatement>();
    };
    CheckStatementDeletionWorks(original, expected, statement_finder);
}

TEST(DeleteStatementTest, DoNotDeleteVariableDeclaration) {
    auto original = R"(
fn main() {
  var x : i32;
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST().Functions()[0]->body->statements[0]->As<ast::VariableDeclStatement>();
    };
    CheckStatementDeletionNotAllowed(original, statement_finder);
}

TEST(DeleteStatementTest, DoNotDeleteCaseDueToFallthrough) {
    auto original = R"(
fn main() {
  switch(1) {
    default: {
      fallthrough;
    }
    case 2: {
    }
  }
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST()
            .Functions()[0]
            ->body->statements[0]
            ->As<ast::SwitchStatement>()
            ->body[1]
            ->As<ast::CaseStatement>();
    };
    CheckStatementDeletionNotAllowed(original, statement_finder);
}

TEST(DeleteStatementTest, DoNotMakeLoopInfinite1) {
    auto original = R"(
fn main() {
  loop {
    break;
  }
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST()
            .Functions()[0]
            ->body->statements[0]
            ->As<ast::LoopStatement>()
            ->body->statements[0]
            ->As<ast::BreakStatement>();
    };
    CheckStatementDeletionNotAllowed(original, statement_finder);
}

TEST(DeleteStatementTest, DoNotMakeLoopInfinite2) {
    auto original = R"(
fn main() {
  loop {
    if (true) {
      break;
    }
  }
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST()
            .Functions()[0]
            ->body->statements[0]
            ->As<ast::LoopStatement>()
            ->body->statements[0]
            ->As<ast::IfStatement>();
    };
    CheckStatementDeletionNotAllowed(original, statement_finder);
}

TEST(DeleteStatementTest, DoNotRemoveReturn) {
    auto original = R"(
fn main() {
  return;
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST().Functions()[0]->body->statements[0]->As<ast::ReturnStatement>();
    };
    CheckStatementDeletionNotAllowed(original, statement_finder);
}

TEST(DeleteStatementTest, DoNotRemoveStatementContainingReturn) {
    auto original = R"(
fn foo() -> i32 {
  if (true) {
    return 1;
  } else {
    return 2;
  }
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST().Functions()[0]->body->statements[0]->As<ast::IfStatement>();
    };
    CheckStatementDeletionNotAllowed(original, statement_finder);
}

TEST(DeleteStatementTest, DoNotRemoveDiscard) {
    auto original = R"(
fn main() {
  discard;
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST().Functions()[0]->body->statements[0]->As<ast::DiscardStatement>();
    };
    CheckStatementDeletionNotAllowed(original, statement_finder);
}

TEST(DeleteStatementTest, DoNotRemoveStatementContainingDiscard) {
    auto original = R"(
fn foo() -> i32 {
  if (true) {
    discard;
  } else {
    discard;
  }
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST().Functions()[0]->body->statements[0]->As<ast::IfStatement>();
    };
    CheckStatementDeletionNotAllowed(original, statement_finder);
}

TEST(DeleteStatementTest, DoNotRemoveLoopBody) {
    auto original = R"(
fn foo() {
  discard;
}
fn main() {
  loop {
    foo();
  }
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST().Functions()[1]->body->statements[0]->As<ast::LoopStatement>()->body;
    };
    CheckStatementDeletionNotAllowed(original, statement_finder);
}

TEST(DeleteStatementTest, DoNotRemoveForLoopBody) {
    auto original = R"(
fn main() {
  for(var i : i32 = 0; i < 10; i++) {
  }
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST().Functions()[0]->body->statements[0]->As<ast::ForLoopStatement>()->body;
    };
    CheckStatementDeletionNotAllowed(original, statement_finder);
}

TEST(DeleteStatementTest, DoNotRemoveWhileBody) {
    auto original = R"(
fn main() {
  var i : i32 = 0;
  while(i < 10) {
    i++;
  }
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST().Functions()[0]->body->statements[1]->As<ast::WhileStatement>()->body;
    };
    CheckStatementDeletionNotAllowed(original, statement_finder);
}

TEST(DeleteStatementTest, DoNotRemoveIfBody) {
    auto original = R"(
fn main() {
  if(true) {
  }
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST().Functions()[0]->body->statements[0]->As<ast::IfStatement>()->body;
    };
    CheckStatementDeletionNotAllowed(original, statement_finder);
}

TEST(DeleteStatementTest, DoNotRemoveFunctionBody) {
    auto original = R"(
fn main() {
})";
    auto statement_finder = [](const Program& program) -> const ast::Statement* {
        return program.AST().Functions()[0]->body;
    };
    CheckStatementDeletionNotAllowed(original, statement_finder);
}

}  // namespace
}  // namespace tint::fuzzers::ast_fuzzer
