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

#include <string>
#include <unordered_set>
#include <vector>

#include "gtest/gtest.h"

#include "src/tint/fuzzers/tint_ast_fuzzer/mutator.h"
#include "src/tint/fuzzers/tint_ast_fuzzer/node_id_map.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 {

std::string OpToString(ast::BinaryOp op) {
  switch (op) {
    case ast::BinaryOp::kNone:
      assert(false && "Unreachable");
      return "";
    case ast::BinaryOp::kAnd:
      return "&";
    case ast::BinaryOp::kOr:
      return "|";
    case ast::BinaryOp::kXor:
      return "^";
    case ast::BinaryOp::kLogicalAnd:
      return "&&";
    case ast::BinaryOp::kLogicalOr:
      return "||";
    case ast::BinaryOp::kEqual:
      return "==";
    case ast::BinaryOp::kNotEqual:
      return "!=";
    case ast::BinaryOp::kLessThan:
      return "<";
    case ast::BinaryOp::kGreaterThan:
      return ">";
    case ast::BinaryOp::kLessThanEqual:
      return "<=";
    case ast::BinaryOp::kGreaterThanEqual:
      return ">=";
    case ast::BinaryOp::kShiftLeft:
      return "<<";
    case ast::BinaryOp::kShiftRight:
      return ">>";
    case ast::BinaryOp::kAdd:
      return "+";
    case ast::BinaryOp::kSubtract:
      return "-";
    case ast::BinaryOp::kMultiply:
      return "*";
    case ast::BinaryOp::kDivide:
      return "/";
    case ast::BinaryOp::kModulo:
      return "%";
  }
}

TEST(ChangeBinaryOperatorTest, NotApplicable_Simple) {
  std::string content = R"(
    fn main() {
      let a : i32 = 1 + 2;
    }
  )";
  Source::File file("test.wgsl", content);
  auto program = reader::wgsl::Parse(&file);
  ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();

  NodeIdMap node_id_map(program);

  const auto& main_fn_stmts = program.AST().Functions()[0]->body->statements;

  const auto* a_var =
      main_fn_stmts[0]->As<ast::VariableDeclStatement>()->variable;
  ASSERT_NE(a_var, nullptr);

  auto a_var_id = node_id_map.GetId(a_var);

  const auto* sum_expr = a_var->constructor->As<ast::BinaryExpression>();
  ASSERT_NE(sum_expr, nullptr);

  auto sum_expr_id = node_id_map.GetId(sum_expr);
  ASSERT_NE(sum_expr_id, 0);

  // binary_expr_id is invalid.
  EXPECT_FALSE(MutationChangeBinaryOperator(0, ast::BinaryOp::kSubtract)
                   .IsApplicable(program, node_id_map));

  // binary_expr_id is not a binary expression.
  EXPECT_FALSE(MutationChangeBinaryOperator(a_var_id, ast::BinaryOp::kSubtract)
                   .IsApplicable(program, node_id_map));

  // new_operator is applicable to the argument types.
  EXPECT_FALSE(MutationChangeBinaryOperator(0, ast::BinaryOp::kLogicalAnd)
                   .IsApplicable(program, node_id_map));

  // new_operator does not have the right result type.
  EXPECT_FALSE(MutationChangeBinaryOperator(0, ast::BinaryOp::kLessThan)
                   .IsApplicable(program, node_id_map));
}

TEST(ChangeBinaryOperatorTest, Applicable_Simple) {
  std::string shader = R"(fn main() {
  let a : i32 = (1 + 2);
}
)";
  Source::File file("test.wgsl", shader);
  auto program = reader::wgsl::Parse(&file);
  ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();

  NodeIdMap node_id_map(program);

  const auto& main_fn_stmts = program.AST().Functions()[0]->body->statements;

  const auto* a_var =
      main_fn_stmts[0]->As<ast::VariableDeclStatement>()->variable;
  ASSERT_NE(a_var, nullptr);

  const auto* sum_expr = a_var->constructor->As<ast::BinaryExpression>();
  ASSERT_NE(sum_expr, nullptr);

  auto sum_expr_id = node_id_map.GetId(sum_expr);
  ASSERT_NE(sum_expr_id, 0);

  ASSERT_TRUE(MaybeApplyMutation(
      program,
      MutationChangeBinaryOperator(sum_expr_id, ast::BinaryOp::kSubtract),
      node_id_map, &program, &node_id_map, nullptr));
  ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();

  writer::wgsl::Options options;
  auto result = writer::wgsl::Generate(&program, options);
  ASSERT_TRUE(result.success) << result.error;

  std::string expected_shader = R"(fn main() {
  let a : i32 = (1 - 2);
}
)";
  ASSERT_EQ(expected_shader, result.wgsl);
}

void CheckMutations(
    const std::string& lhs_type,
    const std::string& rhs_type,
    const std::string& result_type,
    ast::BinaryOp original_operator,
    const std::unordered_set<ast::BinaryOp>& allowed_replacement_operators) {
  std::stringstream shader;
  shader << "fn foo(a : " << lhs_type << ", b : " << rhs_type + ") {\n"
         << "  let r : " << result_type
         << " = (a " + OpToString(original_operator) << " b);\n}\n";

  const std::vector<ast::BinaryOp> all_operators = {
      ast::BinaryOp::kAnd,
      ast::BinaryOp::kOr,
      ast::BinaryOp::kXor,
      ast::BinaryOp::kLogicalAnd,
      ast::BinaryOp::kLogicalOr,
      ast::BinaryOp::kEqual,
      ast::BinaryOp::kNotEqual,
      ast::BinaryOp::kLessThan,
      ast::BinaryOp::kGreaterThan,
      ast::BinaryOp::kLessThanEqual,
      ast::BinaryOp::kGreaterThanEqual,
      ast::BinaryOp::kShiftLeft,
      ast::BinaryOp::kShiftRight,
      ast::BinaryOp::kAdd,
      ast::BinaryOp::kSubtract,
      ast::BinaryOp::kMultiply,
      ast::BinaryOp::kDivide,
      ast::BinaryOp::kModulo};

  for (auto new_operator : all_operators) {
    Source::File file("test.wgsl", shader.str());
    auto program = reader::wgsl::Parse(&file);
    ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();

    NodeIdMap node_id_map(program);

    const auto& stmts = program.AST().Functions()[0]->body->statements;

    const auto* r_var = stmts[0]->As<ast::VariableDeclStatement>()->variable;
    ASSERT_NE(r_var, nullptr);

    const auto* binary_expr = r_var->constructor->As<ast::BinaryExpression>();
    ASSERT_NE(binary_expr, nullptr);

    auto binary_expr_id = node_id_map.GetId(binary_expr);
    ASSERT_NE(binary_expr_id, 0);

    MutationChangeBinaryOperator mutation(binary_expr_id, new_operator);

    std::stringstream expected_shader;
    expected_shader << "fn foo(a : " << lhs_type << ", b : " << rhs_type
                    << ") {\n"
                    << "  let r : " << result_type << " = (a "
                    << OpToString(new_operator) << " b);\n}\n";

    if (allowed_replacement_operators.count(new_operator) == 0) {
      ASSERT_FALSE(mutation.IsApplicable(program, node_id_map));
      if (new_operator != binary_expr->op) {
        Source::File invalid_file("test.wgsl", expected_shader.str());
        auto invalid_program = reader::wgsl::Parse(&invalid_file);
        ASSERT_FALSE(invalid_program.IsValid()) << program.Diagnostics().str();
      }
    } else {
      ASSERT_TRUE(MaybeApplyMutation(program, mutation, node_id_map, &program,
                                     &node_id_map, nullptr));
      ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();

      writer::wgsl::Options options;
      auto result = writer::wgsl::Generate(&program, options);
      ASSERT_TRUE(result.success) << result.error;

      ASSERT_EQ(expected_shader.str(), result.wgsl);
    }
  }
}

TEST(ChangeBinaryOperatorTest, AddSubtract) {
  for (auto op : {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract}) {
    const ast::BinaryOp other_op = op == ast::BinaryOp::kAdd
                                       ? ast::BinaryOp::kSubtract
                                       : ast::BinaryOp::kAdd;
    for (std::string type : {"i32", "vec2<i32>", "vec3<i32>", "vec4<i32>"}) {
      CheckMutations(
          type, type, type, op,
          {other_op, ast::BinaryOp::kMultiply, ast::BinaryOp::kDivide,
           ast::BinaryOp::kModulo, ast::BinaryOp::kAnd, ast::BinaryOp::kOr,
           ast::BinaryOp::kXor});
    }
    for (std::string type : {"u32", "vec2<u32>", "vec3<u32>", "vec4<u32>"}) {
      CheckMutations(
          type, type, type, op,
          {other_op, ast::BinaryOp::kMultiply, ast::BinaryOp::kDivide,
           ast::BinaryOp::kModulo, ast::BinaryOp::kAnd, ast::BinaryOp::kOr,
           ast::BinaryOp::kXor, ast::BinaryOp::kShiftLeft,
           ast::BinaryOp::kShiftRight});
    }
    for (std::string type : {"f32", "vec2<f32>", "vec3<f32>", "vec4<f32>"}) {
      CheckMutations(type, type, type, op,
                     {other_op, ast::BinaryOp::kMultiply,
                      ast::BinaryOp::kDivide, ast::BinaryOp::kModulo});
    }
    for (std::string vector_type : {"vec2<i32>", "vec3<i32>", "vec4<i32>"}) {
      std::string scalar_type = "i32";
      CheckMutations(vector_type, scalar_type, vector_type, op,
                     {other_op, ast::BinaryOp::kMultiply,
                      ast::BinaryOp::kDivide, ast::BinaryOp::kModulo});
      CheckMutations(scalar_type, vector_type, vector_type, op,
                     {other_op, ast::BinaryOp::kMultiply,
                      ast::BinaryOp::kDivide, ast::BinaryOp::kModulo});
    }
    for (std::string vector_type : {"vec2<u32>", "vec3<u32>", "vec4<u32>"}) {
      std::string scalar_type = "u32";
      CheckMutations(vector_type, scalar_type, vector_type, op,
                     {other_op, ast::BinaryOp::kMultiply,
                      ast::BinaryOp::kDivide, ast::BinaryOp::kModulo});
      CheckMutations(scalar_type, vector_type, vector_type, op,
                     {other_op, ast::BinaryOp::kMultiply,
                      ast::BinaryOp::kDivide, ast::BinaryOp::kModulo});
    }
    for (std::string vector_type : {"vec2<f32>", "vec3<f32>", "vec4<f32>"}) {
      std::string scalar_type = "f32";
      CheckMutations(vector_type, scalar_type, vector_type, op,
                     {other_op, ast::BinaryOp::kMultiply,
                      ast::BinaryOp::kDivide, ast::BinaryOp::kModulo});
      CheckMutations(scalar_type, vector_type, vector_type, op,
                     {other_op, ast::BinaryOp::kMultiply,
                      ast::BinaryOp::kDivide, ast::BinaryOp::kModulo});
    }
    for (std::string square_matrix_type :
         {"mat2x2<f32>", "mat3x3<f32>", "mat4x4<f32>"}) {
      CheckMutations(square_matrix_type, square_matrix_type, square_matrix_type,
                     op, {other_op, ast::BinaryOp::kMultiply});
    }
    for (std::string non_square_matrix_type :
         {"mat2x3<f32>", "mat2x4<f32>", "mat3x2<f32>", "mat3x4<f32>",
          "mat4x2<f32>", "mat4x3<f32>"}) {
      CheckMutations(non_square_matrix_type, non_square_matrix_type,
                     non_square_matrix_type, op, {other_op});
    }
  }
}

TEST(ChangeBinaryOperatorTest, Mul) {
  for (std::string type : {"i32", "vec2<i32>", "vec3<i32>", "vec4<i32>"}) {
    CheckMutations(
        type, type, type, ast::BinaryOp::kMultiply,
        {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract, ast::BinaryOp::kDivide,
         ast::BinaryOp::kModulo, ast::BinaryOp::kAnd, ast::BinaryOp::kOr,
         ast::BinaryOp::kXor});
  }
  for (std::string type : {"u32", "vec2<u32>", "vec3<u32>", "vec4<u32>"}) {
    CheckMutations(
        type, type, type, ast::BinaryOp::kMultiply,
        {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract, ast::BinaryOp::kDivide,
         ast::BinaryOp::kModulo, ast::BinaryOp::kAnd, ast::BinaryOp::kOr,
         ast::BinaryOp::kXor, ast::BinaryOp::kShiftLeft,
         ast::BinaryOp::kShiftRight});
  }
  for (std::string type : {"f32", "vec2<f32>", "vec3<f32>", "vec4<f32>"}) {
    CheckMutations(type, type, type, ast::BinaryOp::kMultiply,
                   {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract,
                    ast::BinaryOp::kDivide, ast::BinaryOp::kModulo});
  }
  for (std::string vector_type : {"vec2<i32>", "vec3<i32>", "vec4<i32>"}) {
    std::string scalar_type = "i32";
    CheckMutations(vector_type, scalar_type, vector_type,
                   ast::BinaryOp::kMultiply,
                   {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract,
                    ast::BinaryOp::kDivide, ast::BinaryOp::kModulo});
    CheckMutations(scalar_type, vector_type, vector_type,
                   ast::BinaryOp::kMultiply,
                   {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract,
                    ast::BinaryOp::kDivide, ast::BinaryOp::kModulo});
  }
  for (std::string vector_type : {"vec2<u32>", "vec3<u32>", "vec4<u32>"}) {
    std::string scalar_type = "u32";
    CheckMutations(vector_type, scalar_type, vector_type,
                   ast::BinaryOp::kMultiply,
                   {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract,
                    ast::BinaryOp::kDivide, ast::BinaryOp::kModulo});
    CheckMutations(scalar_type, vector_type, vector_type,
                   ast::BinaryOp::kMultiply,
                   {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract,
                    ast::BinaryOp::kDivide, ast::BinaryOp::kModulo});
  }
  for (std::string vector_type : {"vec2<f32>", "vec3<f32>", "vec4<f32>"}) {
    std::string scalar_type = "f32";
    CheckMutations(vector_type, scalar_type, vector_type,
                   ast::BinaryOp::kMultiply,
                   {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract,
                    ast::BinaryOp::kDivide, ast::BinaryOp::kModulo});
    CheckMutations(scalar_type, vector_type, vector_type,
                   ast::BinaryOp::kMultiply,
                   {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract,
                    ast::BinaryOp::kDivide, ast::BinaryOp::kModulo});
  }
  for (std::string square_matrix_type :
       {"mat2x2<f32>", "mat3x3<f32>", "mat4x4<f32>"}) {
    CheckMutations(square_matrix_type, square_matrix_type, square_matrix_type,
                   ast::BinaryOp::kMultiply,
                   {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract});
  }

  CheckMutations("vec2<f32>", "mat2x2<f32>", "vec2<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("vec2<f32>", "mat3x2<f32>", "vec3<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("vec2<f32>", "mat4x2<f32>", "vec4<f32>",
                 ast::BinaryOp::kMultiply, {});

  CheckMutations("mat2x2<f32>", "vec2<f32>", "vec2<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("mat2x2<f32>", "mat3x2<f32>", "mat3x2<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("mat2x2<f32>", "mat4x2<f32>", "mat4x2<f32>",
                 ast::BinaryOp::kMultiply, {});

  CheckMutations("mat2x3<f32>", "vec2<f32>", "vec3<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("mat2x3<f32>", "mat2x2<f32>", "mat2x3<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("mat2x3<f32>", "mat3x2<f32>", "mat3x3<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("mat2x3<f32>", "mat4x2<f32>", "mat4x3<f32>",
                 ast::BinaryOp::kMultiply, {});

  CheckMutations("mat2x4<f32>", "vec2<f32>", "vec4<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("mat2x4<f32>", "mat2x2<f32>", "mat2x4<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("mat2x4<f32>", "mat3x2<f32>", "mat3x4<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("mat2x4<f32>", "mat4x2<f32>", "mat4x4<f32>",
                 ast::BinaryOp::kMultiply, {});

  CheckMutations("vec3<f32>", "mat2x3<f32>", "vec2<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("vec3<f32>", "mat3x3<f32>", "vec3<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("vec3<f32>", "mat4x3<f32>", "vec4<f32>",
                 ast::BinaryOp::kMultiply, {});

  CheckMutations("mat3x2<f32>", "vec3<f32>", "vec2<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("mat3x2<f32>", "mat2x3<f32>", "mat2x2<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("mat3x2<f32>", "mat3x3<f32>", "mat3x2<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("mat3x2<f32>", "mat4x3<f32>", "mat4x2<f32>",
                 ast::BinaryOp::kMultiply, {});

  CheckMutations("mat3x3<f32>", "vec3<f32>", "vec3<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("mat3x3<f32>", "mat2x3<f32>", "mat2x3<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("mat3x3<f32>", "mat4x3<f32>", "mat4x3<f32>",
                 ast::BinaryOp::kMultiply, {});

  CheckMutations("mat3x4<f32>", "vec3<f32>", "vec4<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("mat3x4<f32>", "mat2x3<f32>", "mat2x4<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("mat3x4<f32>", "mat3x3<f32>", "mat3x4<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("mat3x4<f32>", "mat4x3<f32>", "mat4x4<f32>",
                 ast::BinaryOp::kMultiply, {});

  CheckMutations("vec4<f32>", "mat2x4<f32>", "vec2<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("vec4<f32>", "mat3x4<f32>", "vec3<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("vec4<f32>", "mat4x4<f32>", "vec4<f32>",
                 ast::BinaryOp::kMultiply, {});

  CheckMutations("mat4x2<f32>", "vec4<f32>", "vec2<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("mat4x2<f32>", "mat2x4<f32>", "mat2x2<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("mat4x2<f32>", "mat3x4<f32>", "mat3x2<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("mat4x2<f32>", "mat4x4<f32>", "mat4x2<f32>",
                 ast::BinaryOp::kMultiply, {});

  CheckMutations("mat4x3<f32>", "vec4<f32>", "vec3<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("mat4x3<f32>", "mat2x4<f32>", "mat2x3<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("mat4x3<f32>", "mat3x4<f32>", "mat3x3<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("mat4x3<f32>", "mat4x4<f32>", "mat4x3<f32>",
                 ast::BinaryOp::kMultiply, {});

  CheckMutations("mat4x4<f32>", "vec4<f32>", "vec4<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("mat4x4<f32>", "mat2x4<f32>", "mat2x4<f32>",
                 ast::BinaryOp::kMultiply, {});
  CheckMutations("mat4x4<f32>", "mat3x4<f32>", "mat3x4<f32>",
                 ast::BinaryOp::kMultiply, {});
}

TEST(ChangeBinaryOperatorTest, DivideAndModulo) {
  for (std::string type : {"i32", "vec2<i32>", "vec3<i32>", "vec4<i32>"}) {
    CheckMutations(
        type, type, type, ast::BinaryOp::kDivide,
        {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract,
         ast::BinaryOp::kMultiply, ast::BinaryOp::kModulo, ast::BinaryOp::kAnd,
         ast::BinaryOp::kOr, ast::BinaryOp::kXor});
  }
  for (std::string type : {"u32", "vec2<u32>", "vec3<u32>", "vec4<u32>"}) {
    CheckMutations(
        type, type, type, ast::BinaryOp::kDivide,
        {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract,
         ast::BinaryOp::kMultiply, ast::BinaryOp::kModulo, ast::BinaryOp::kAnd,
         ast::BinaryOp::kOr, ast::BinaryOp::kXor, ast::BinaryOp::kShiftLeft,
         ast::BinaryOp::kShiftRight});
  }
  for (std::string type : {"f32", "vec2<f32>", "vec3<f32>", "vec4<f32>"}) {
    CheckMutations(type, type, type, ast::BinaryOp::kDivide,
                   {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract,
                    ast::BinaryOp::kMultiply, ast::BinaryOp::kModulo});
  }
  for (std::string vector_type : {"vec2<i32>", "vec3<i32>", "vec4<i32>"}) {
    std::string scalar_type = "i32";
    CheckMutations(vector_type, scalar_type, vector_type,
                   ast::BinaryOp::kDivide,
                   {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract,
                    ast::BinaryOp::kMultiply, ast::BinaryOp::kModulo});
    CheckMutations(scalar_type, vector_type, vector_type,
                   ast::BinaryOp::kDivide,
                   {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract,
                    ast::BinaryOp::kMultiply, ast::BinaryOp::kModulo});
  }
  for (std::string vector_type : {"vec2<u32>", "vec3<u32>", "vec4<u32>"}) {
    std::string scalar_type = "u32";
    CheckMutations(vector_type, scalar_type, vector_type,
                   ast::BinaryOp::kDivide,
                   {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract,
                    ast::BinaryOp::kMultiply, ast::BinaryOp::kModulo});
    CheckMutations(scalar_type, vector_type, vector_type,
                   ast::BinaryOp::kDivide,
                   {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract,
                    ast::BinaryOp::kMultiply, ast::BinaryOp::kModulo});
  }
  for (std::string vector_type : {"vec2<f32>", "vec3<f32>", "vec4<f32>"}) {
    std::string scalar_type = "f32";
    CheckMutations(vector_type, scalar_type, vector_type,
                   ast::BinaryOp::kDivide,
                   {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract,
                    ast::BinaryOp::kMultiply, ast::BinaryOp::kModulo});
    CheckMutations(scalar_type, vector_type, vector_type,
                   ast::BinaryOp::kDivide,
                   {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract,
                    ast::BinaryOp::kMultiply, ast::BinaryOp::kModulo});
  }
  for (std::string type : {"i32", "vec2<i32>", "vec3<i32>", "vec4<i32>"}) {
    CheckMutations(
        type, type, type, ast::BinaryOp::kModulo,
        {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract,
         ast::BinaryOp::kMultiply, ast::BinaryOp::kDivide, ast::BinaryOp::kAnd,
         ast::BinaryOp::kOr, ast::BinaryOp::kXor});
  }
  for (std::string type : {"u32", "vec2<u32>", "vec3<u32>", "vec4<u32>"}) {
    CheckMutations(
        type, type, type, ast::BinaryOp::kModulo,
        {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract,
         ast::BinaryOp::kMultiply, ast::BinaryOp::kDivide, ast::BinaryOp::kAnd,
         ast::BinaryOp::kOr, ast::BinaryOp::kXor, ast::BinaryOp::kShiftLeft,
         ast::BinaryOp::kShiftRight});
  }
  for (std::string type : {"f32", "vec2<f32>", "vec3<f32>", "vec4<f32>"}) {
    CheckMutations(type, type, type, ast::BinaryOp::kModulo,
                   {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract,
                    ast::BinaryOp::kMultiply, ast::BinaryOp::kDivide});
  }
  for (std::string vector_type : {"vec2<i32>", "vec3<i32>", "vec4<i32>"}) {
    std::string scalar_type = "i32";
    CheckMutations(vector_type, scalar_type, vector_type,
                   ast::BinaryOp::kModulo,
                   {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract,
                    ast::BinaryOp::kMultiply, ast::BinaryOp::kDivide});
    CheckMutations(scalar_type, vector_type, vector_type,
                   ast::BinaryOp::kModulo,
                   {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract,
                    ast::BinaryOp::kMultiply, ast::BinaryOp::kDivide});
  }
  for (std::string vector_type : {"vec2<u32>", "vec3<u32>", "vec4<u32>"}) {
    std::string scalar_type = "u32";
    CheckMutations(vector_type, scalar_type, vector_type,
                   ast::BinaryOp::kModulo,
                   {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract,
                    ast::BinaryOp::kMultiply, ast::BinaryOp::kDivide});
    CheckMutations(scalar_type, vector_type, vector_type,
                   ast::BinaryOp::kModulo,
                   {ast::BinaryOp::kAdd, ast::BinaryOp::kSubtract,
                    ast::BinaryOp::kMultiply, ast::BinaryOp::kDivide});
  }
}

TEST(ChangeBinaryOperatorTest, AndOrXor) {
  for (auto op :
       {ast::BinaryOp::kAnd, ast::BinaryOp::kOr, ast::BinaryOp::kXor}) {
    std::unordered_set<ast::BinaryOp> allowed_replacement_operators_signed{
        ast::BinaryOp::kAdd,      ast::BinaryOp::kSubtract,
        ast::BinaryOp::kMultiply, ast::BinaryOp::kDivide,
        ast::BinaryOp::kModulo,   ast::BinaryOp::kAnd,
        ast::BinaryOp::kOr,       ast::BinaryOp::kXor};
    allowed_replacement_operators_signed.erase(op);
    for (std::string type : {"i32", "vec2<i32>", "vec3<i32>", "vec4<i32>"}) {
      CheckMutations(type, type, type, op,
                     allowed_replacement_operators_signed);
    }
    std::unordered_set<ast::BinaryOp> allowed_replacement_operators_unsigned{
        ast::BinaryOp::kAdd,        ast::BinaryOp::kSubtract,
        ast::BinaryOp::kMultiply,   ast::BinaryOp::kDivide,
        ast::BinaryOp::kModulo,     ast::BinaryOp::kShiftLeft,
        ast::BinaryOp::kShiftRight, ast::BinaryOp::kAnd,
        ast::BinaryOp::kOr,         ast::BinaryOp::kXor};
    allowed_replacement_operators_unsigned.erase(op);
    for (std::string type : {"u32", "vec2<u32>", "vec3<u32>", "vec4<u32>"}) {
      CheckMutations(type, type, type, op,
                     allowed_replacement_operators_unsigned);
    }
    if (op != ast::BinaryOp::kXor) {
      for (std::string type :
           {"bool", "vec2<bool>", "vec3<bool>", "vec4<bool>"}) {
        std::unordered_set<ast::BinaryOp> allowed_replacement_operators_bool{
            ast::BinaryOp::kAnd, ast::BinaryOp::kOr, ast::BinaryOp::kEqual,
            ast::BinaryOp::kNotEqual};
        allowed_replacement_operators_bool.erase(op);
        if (type == "bool") {
          allowed_replacement_operators_bool.insert(ast::BinaryOp::kLogicalAnd);
          allowed_replacement_operators_bool.insert(ast::BinaryOp::kLogicalOr);
        }
        CheckMutations(type, type, type, op,
                       allowed_replacement_operators_bool);
      }
    }
  }
}

TEST(ChangeBinaryOperatorTest, EqualNotEqual) {
  for (auto op : {ast::BinaryOp::kEqual, ast::BinaryOp::kNotEqual}) {
    for (std::string element_type : {"i32", "u32", "f32"}) {
      for (size_t element_count = 1; element_count <= 4; element_count++) {
        std::stringstream argument_type;
        std::stringstream result_type;
        if (element_count == 1) {
          argument_type << element_type;
          result_type << "bool";
        } else {
          argument_type << "vec" << element_count << "<" << element_type << ">";
          result_type << "vec" << element_count << "<bool>";
        }
        std::unordered_set<ast::BinaryOp> allowed_replacement_operators{
            ast::BinaryOp::kLessThan,    ast::BinaryOp::kLessThanEqual,
            ast::BinaryOp::kGreaterThan, ast::BinaryOp::kGreaterThanEqual,
            ast::BinaryOp::kEqual,       ast::BinaryOp::kNotEqual};
        allowed_replacement_operators.erase(op);
        CheckMutations(argument_type.str(), argument_type.str(),
                       result_type.str(), op, allowed_replacement_operators);
      }
    }
    {
      std::unordered_set<ast::BinaryOp> allowed_replacement_operators{
          ast::BinaryOp::kLogicalAnd, ast::BinaryOp::kLogicalOr,
          ast::BinaryOp::kAnd,        ast::BinaryOp::kOr,
          ast::BinaryOp::kEqual,      ast::BinaryOp::kNotEqual};
      allowed_replacement_operators.erase(op);
      CheckMutations("bool", "bool", "bool", op, allowed_replacement_operators);
    }
    for (size_t element_count = 2; element_count <= 4; element_count++) {
      std::stringstream argument_and_result_type;
      argument_and_result_type << "vec" << element_count << "<bool>";
      std::unordered_set<ast::BinaryOp> allowed_replacement_operators{
          ast::BinaryOp::kAnd, ast::BinaryOp::kOr, ast::BinaryOp::kEqual,
          ast::BinaryOp::kNotEqual};
      allowed_replacement_operators.erase(op);
      CheckMutations(
          argument_and_result_type.str(), argument_and_result_type.str(),
          argument_and_result_type.str(), op, allowed_replacement_operators);
    }
  }
}

TEST(ChangeBinaryOperatorTest,
     LessThanLessThanEqualGreaterThanGreaterThanEqual) {
  for (auto op :
       {ast::BinaryOp::kLessThan, ast::BinaryOp::kLessThanEqual,
        ast::BinaryOp::kGreaterThan, ast::BinaryOp::kGreaterThanEqual}) {
    for (std::string element_type : {"i32", "u32", "f32"}) {
      for (size_t element_count = 1; element_count <= 4; element_count++) {
        std::stringstream argument_type;
        std::stringstream result_type;
        if (element_count == 1) {
          argument_type << element_type;
          result_type << "bool";
        } else {
          argument_type << "vec" << element_count << "<" << element_type << ">";
          result_type << "vec" << element_count << "<bool>";
        }
        std::unordered_set<ast::BinaryOp> allowed_replacement_operators{
            ast::BinaryOp::kLessThan,    ast::BinaryOp::kLessThanEqual,
            ast::BinaryOp::kGreaterThan, ast::BinaryOp::kGreaterThanEqual,
            ast::BinaryOp::kEqual,       ast::BinaryOp::kNotEqual};
        allowed_replacement_operators.erase(op);
        CheckMutations(argument_type.str(), argument_type.str(),
                       result_type.str(), op, allowed_replacement_operators);
      }
    }
  }
}

TEST(ChangeBinaryOperatorTest, LogicalAndLogicalOr) {
  for (auto op : {ast::BinaryOp::kLogicalAnd, ast::BinaryOp::kLogicalOr}) {
    std::unordered_set<ast::BinaryOp> allowed_replacement_operators{
        ast::BinaryOp::kLogicalAnd, ast::BinaryOp::kLogicalOr,
        ast::BinaryOp::kAnd,        ast::BinaryOp::kOr,
        ast::BinaryOp::kEqual,      ast::BinaryOp::kNotEqual};
    allowed_replacement_operators.erase(op);
    CheckMutations("bool", "bool", "bool", op, allowed_replacement_operators);
  }
}

TEST(ChangeBinaryOperatorTest, ShiftLeftShiftRight) {
  for (auto op : {ast::BinaryOp::kShiftLeft, ast::BinaryOp::kShiftRight}) {
    for (std::string lhs_element_type : {"i32", "u32"}) {
      for (size_t element_count = 1; element_count <= 4; element_count++) {
        std::stringstream lhs_and_result_type;
        std::stringstream rhs_type;
        if (element_count == 1) {
          lhs_and_result_type << lhs_element_type;
          rhs_type << "u32";
        } else {
          lhs_and_result_type << "vec" << element_count << "<"
                              << lhs_element_type << ">";
          rhs_type << "vec" << element_count << "<u32>";
        }
        std::unordered_set<ast::BinaryOp> allowed_replacement_operators{
            ast::BinaryOp::kShiftLeft, ast::BinaryOp::kShiftRight};
        allowed_replacement_operators.erase(op);
        if (lhs_element_type == "u32") {
          allowed_replacement_operators.insert(ast::BinaryOp::kAdd);
          allowed_replacement_operators.insert(ast::BinaryOp::kSubtract);
          allowed_replacement_operators.insert(ast::BinaryOp::kMultiply);
          allowed_replacement_operators.insert(ast::BinaryOp::kDivide);
          allowed_replacement_operators.insert(ast::BinaryOp::kModulo);
          allowed_replacement_operators.insert(ast::BinaryOp::kAnd);
          allowed_replacement_operators.insert(ast::BinaryOp::kOr);
          allowed_replacement_operators.insert(ast::BinaryOp::kXor);
        }
        CheckMutations(lhs_and_result_type.str(), rhs_type.str(),
                       lhs_and_result_type.str(), op,
                       allowed_replacement_operators);
      }
    }
  }
}

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