//===- DebugActionTest.cpp - Debug Action Tests ---------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "mlir/Support/DebugAction.h"
#include "gmock/gmock.h"

// DebugActionManager is only enabled in DEBUG mode.
#if LLVM_ENABLE_ABI_BREAKING_CHECKS

using namespace mlir;

namespace {
struct SimpleAction : public DebugAction<> {
  static StringRef getTag() { return "simple-action"; }
  static StringRef getDescription() { return "simple-action-description"; }
};
struct ParametricAction : public DebugAction<bool> {
  static StringRef getTag() { return "param-action"; }
  static StringRef getDescription() { return "param-action-description"; }
};

TEST(DebugActionTest, GenericHandler) {
  DebugActionManager manager;

  // A generic handler that always executes the simple action, but not the
  // parametric action.
  struct GenericHandler : public DebugActionManager::GenericHandler {
    FailureOr<bool> shouldExecute(StringRef tag, StringRef desc) final {
      if (tag == SimpleAction::getTag()) {
        EXPECT_EQ(desc, SimpleAction::getDescription());
        return true;
      }

      EXPECT_EQ(tag, ParametricAction::getTag());
      EXPECT_EQ(desc, ParametricAction::getDescription());
      return false;
    }
  };
  manager.registerActionHandler<GenericHandler>();

  EXPECT_TRUE(manager.shouldExecute<SimpleAction>());
  EXPECT_FALSE(manager.shouldExecute<ParametricAction>(true));
}

TEST(DebugActionTest, ActionSpecificHandler) {
  DebugActionManager manager;

  // Handler that simply uses the input as the decider.
  struct ActionSpecificHandler : public ParametricAction::Handler {
    FailureOr<bool> shouldExecute(bool shouldExecuteParam) final {
      return shouldExecuteParam;
    }
  };
  manager.registerActionHandler<ActionSpecificHandler>();

  EXPECT_TRUE(manager.shouldExecute<ParametricAction>(true));
  EXPECT_FALSE(manager.shouldExecute<ParametricAction>(false));

  // There is no handler for the simple action, so it is always executed.
  EXPECT_TRUE(manager.shouldExecute<SimpleAction>());
}

TEST(DebugActionTest, DebugCounterHandler) {
  DebugActionManager manager;

  // Handler that uses the number of action executions as the decider.
  struct DebugCounterHandler : public SimpleAction::Handler {
    FailureOr<bool> shouldExecute() final {
      return numExecutions++ < 3;
    }
    unsigned numExecutions = 0;
  };
  manager.registerActionHandler<DebugCounterHandler>();

  // Check that the action is executed 3 times, but no more after.
  EXPECT_TRUE(manager.shouldExecute<SimpleAction>());
  EXPECT_TRUE(manager.shouldExecute<SimpleAction>());
  EXPECT_TRUE(manager.shouldExecute<SimpleAction>());
  EXPECT_FALSE(manager.shouldExecute<SimpleAction>());
  EXPECT_FALSE(manager.shouldExecute<SimpleAction>());
}

} // namespace

#endif
