172d5afa4SRiver Riddle //===- DebugActionTest.cpp - Debug Action Tests ---------------------------===//
272d5afa4SRiver Riddle //
372d5afa4SRiver Riddle // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
472d5afa4SRiver Riddle // See https://llvm.org/LICENSE.txt for license information.
572d5afa4SRiver Riddle // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
672d5afa4SRiver Riddle //
772d5afa4SRiver Riddle //===----------------------------------------------------------------------===//
872d5afa4SRiver Riddle 
972d5afa4SRiver Riddle #include "mlir/Support/DebugAction.h"
1072d5afa4SRiver Riddle #include "gmock/gmock.h"
1172d5afa4SRiver Riddle 
1272d5afa4SRiver Riddle // DebugActionManager is only enabled in DEBUG mode.
136da63573SMogball #if LLVM_ENABLE_ABI_BREAKING_CHECKS
1472d5afa4SRiver Riddle 
1572d5afa4SRiver Riddle using namespace mlir;
1672d5afa4SRiver Riddle 
1772d5afa4SRiver Riddle namespace {
1872d5afa4SRiver Riddle struct SimpleAction : public DebugAction<> {
getTag__anonf43d55660111::SimpleAction1972d5afa4SRiver Riddle   static StringRef getTag() { return "simple-action"; }
getDescription__anonf43d55660111::SimpleAction2072d5afa4SRiver Riddle   static StringRef getDescription() { return "simple-action-description"; }
2172d5afa4SRiver Riddle };
2272d5afa4SRiver Riddle struct ParametricAction : public DebugAction<bool> {
getTag__anonf43d55660111::ParametricAction2372d5afa4SRiver Riddle   static StringRef getTag() { return "param-action"; }
getDescription__anonf43d55660111::ParametricAction2472d5afa4SRiver Riddle   static StringRef getDescription() { return "param-action-description"; }
2572d5afa4SRiver Riddle };
2672d5afa4SRiver Riddle 
TEST(DebugActionTest,GenericHandler)2772d5afa4SRiver Riddle TEST(DebugActionTest, GenericHandler) {
2872d5afa4SRiver Riddle   DebugActionManager manager;
2972d5afa4SRiver Riddle 
3072d5afa4SRiver Riddle   // A generic handler that always executes the simple action, but not the
3172d5afa4SRiver Riddle   // parametric action.
3272d5afa4SRiver Riddle   struct GenericHandler : public DebugActionManager::GenericHandler {
3372d5afa4SRiver Riddle     FailureOr<bool> shouldExecute(StringRef tag, StringRef desc) final {
3472d5afa4SRiver Riddle       if (tag == SimpleAction::getTag()) {
3572d5afa4SRiver Riddle         EXPECT_EQ(desc, SimpleAction::getDescription());
3672d5afa4SRiver Riddle         return true;
3772d5afa4SRiver Riddle       }
3872d5afa4SRiver Riddle 
3972d5afa4SRiver Riddle       EXPECT_EQ(tag, ParametricAction::getTag());
4072d5afa4SRiver Riddle       EXPECT_EQ(desc, ParametricAction::getDescription());
4172d5afa4SRiver Riddle       return false;
4272d5afa4SRiver Riddle     }
4372d5afa4SRiver Riddle   };
4472d5afa4SRiver Riddle   manager.registerActionHandler<GenericHandler>();
4572d5afa4SRiver Riddle 
4672d5afa4SRiver Riddle   EXPECT_TRUE(manager.shouldExecute<SimpleAction>());
4772d5afa4SRiver Riddle   EXPECT_FALSE(manager.shouldExecute<ParametricAction>(true));
4872d5afa4SRiver Riddle }
4972d5afa4SRiver Riddle 
TEST(DebugActionTest,ActionSpecificHandler)5072d5afa4SRiver Riddle TEST(DebugActionTest, ActionSpecificHandler) {
5172d5afa4SRiver Riddle   DebugActionManager manager;
5272d5afa4SRiver Riddle 
5372d5afa4SRiver Riddle   // Handler that simply uses the input as the decider.
5472d5afa4SRiver Riddle   struct ActionSpecificHandler : public ParametricAction::Handler {
5572d5afa4SRiver Riddle     FailureOr<bool> shouldExecute(bool shouldExecuteParam) final {
5672d5afa4SRiver Riddle       return shouldExecuteParam;
5772d5afa4SRiver Riddle     }
5872d5afa4SRiver Riddle   };
5972d5afa4SRiver Riddle   manager.registerActionHandler<ActionSpecificHandler>();
6072d5afa4SRiver Riddle 
6172d5afa4SRiver Riddle   EXPECT_TRUE(manager.shouldExecute<ParametricAction>(true));
6272d5afa4SRiver Riddle   EXPECT_FALSE(manager.shouldExecute<ParametricAction>(false));
6372d5afa4SRiver Riddle 
6472d5afa4SRiver Riddle   // There is no handler for the simple action, so it is always executed.
6572d5afa4SRiver Riddle   EXPECT_TRUE(manager.shouldExecute<SimpleAction>());
6672d5afa4SRiver Riddle }
6772d5afa4SRiver Riddle 
TEST(DebugActionTest,DebugCounterHandler)6872d5afa4SRiver Riddle TEST(DebugActionTest, DebugCounterHandler) {
6972d5afa4SRiver Riddle   DebugActionManager manager;
7072d5afa4SRiver Riddle 
7172d5afa4SRiver Riddle   // Handler that uses the number of action executions as the decider.
7272d5afa4SRiver Riddle   struct DebugCounterHandler : public SimpleAction::Handler {
73*b7f93c28SJeff Niu     FailureOr<bool> shouldExecute() final { return numExecutions++ < 3; }
7472d5afa4SRiver Riddle     unsigned numExecutions = 0;
7572d5afa4SRiver Riddle   };
7672d5afa4SRiver Riddle   manager.registerActionHandler<DebugCounterHandler>();
7772d5afa4SRiver Riddle 
7872d5afa4SRiver Riddle   // Check that the action is executed 3 times, but no more after.
7972d5afa4SRiver Riddle   EXPECT_TRUE(manager.shouldExecute<SimpleAction>());
8072d5afa4SRiver Riddle   EXPECT_TRUE(manager.shouldExecute<SimpleAction>());
8172d5afa4SRiver Riddle   EXPECT_TRUE(manager.shouldExecute<SimpleAction>());
8272d5afa4SRiver Riddle   EXPECT_FALSE(manager.shouldExecute<SimpleAction>());
8372d5afa4SRiver Riddle   EXPECT_FALSE(manager.shouldExecute<SimpleAction>());
8472d5afa4SRiver Riddle }
8572d5afa4SRiver Riddle 
8672d5afa4SRiver Riddle } // namespace
8772d5afa4SRiver Riddle 
8872d5afa4SRiver Riddle #endif
89