// 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 {
namespace fuzzers {
namespace 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 ast_fuzzer
}  // namespace fuzzers
}  // namespace tint
