// 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.

#ifndef SRC_TINT_FUZZERS_TINT_AST_FUZZER_MUTATION_FINDER_H_
#define SRC_TINT_FUZZERS_TINT_AST_FUZZER_MUTATION_FINDER_H_

#include <memory>
#include <vector>

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

namespace tint {
namespace fuzzers {
namespace ast_fuzzer {

/// Instances of this class traverse the `tint::Program`, looking for
/// opportunities to apply mutations and return them to the caller.
///
/// Ideally, the behaviour of this class (precisely, its `FindMutations` method)
/// should not be probabilistic. This is useful when mutation finders are used
/// for test case reduction, because it enables the test case reducer to
/// systematically explore all available mutations. There may be some
/// exceptions, however. For example, if a huge number of mutations is returned,
/// it would make sense to apply only a probabilistically selected subset of
/// them.
class MutationFinder {
 public:
  /// Virtual destructor.
  virtual ~MutationFinder();

  /// @brief Traverses the `program`, looking for opportunities to apply
  /// mutations.
  ///
  /// @param program - the program being fuzzed.
  /// @param node_id_map - a map from `tint::ast::` nodes in the `program` to
  ///     their unique ids.
  /// @param probability_context - determines various probabilistic stuff in the
  ///     mutator. This should ideally be used as less as possible.
  /// @return all the found mutations.
  virtual MutationList FindMutations(
      const tint::Program& program,
      NodeIdMap* node_id_map,
      ProbabilityContext* probability_context) const = 0;

  /// @brief Compute a probability of applying a single mutation, returned by
  /// this class.
  ///
  /// @param probability_context - contains information about various
  ///     non-deterministic stuff in the fuzzer.
  /// @return a number in the range [0; 100] which is a chance of applying a
  ///     mutation.
  virtual uint32_t GetChanceOfApplyingMutation(
      ProbabilityContext* probability_context) const = 0;
};

using MutationFinderList = std::vector<std::unique_ptr<MutationFinder>>;

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

#endif  // SRC_TINT_FUZZERS_TINT_AST_FUZZER_MUTATION_FINDER_H_
