//===-- StackFrameRecognizerTest.cpp --------------------------------------===//
//
// 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 "lldb/Target/StackFrameRecognizer.h"
#include "Plugins/Platform/Linux/PlatformLinux.h"
#include "lldb/Core/Debugger.h"
#include "lldb/Host/FileSystem.h"
#include "lldb/Host/HostInfo.h"
#include "lldb/lldb-enumerations.h"
#include "lldb/lldb-forward.h"
#include "lldb/lldb-private-enumerations.h"
#include "lldb/lldb-private.h"
#include "llvm/Support/FormatVariadic.h"
#include "gtest/gtest.h"

using namespace lldb_private;
using namespace lldb;

namespace {
class StackFrameRecognizerTest : public ::testing::Test {
public:
  void SetUp() override {
    FileSystem::Initialize();
    HostInfo::Initialize();

    // Pretend Linux is the host platform.
    platform_linux::PlatformLinux::Initialize();
    ArchSpec arch("powerpc64-pc-linux");
    Platform::SetHostPlatform(
        platform_linux::PlatformLinux::CreateInstance(true, &arch));
  }

  void TearDown() override {
    platform_linux::PlatformLinux::Terminate();
    HostInfo::Terminate();
    FileSystem::Terminate();
  }
};

class DummyStackFrameRecognizer : public StackFrameRecognizer {
public:
  std::string GetName() override { return "Dummy StackFrame Recognizer"; }
};

void RegisterDummyStackFrameRecognizer(StackFrameRecognizerManager &manager) {
  RegularExpressionSP module_regex_sp = nullptr;
  RegularExpressionSP symbol_regex_sp(new RegularExpression("boom"));

  StackFrameRecognizerSP dummy_recognizer_sp(new DummyStackFrameRecognizer());

  manager.AddRecognizer(dummy_recognizer_sp, module_regex_sp, symbol_regex_sp,
                        Mangled::NamePreference::ePreferDemangled, false);
}

} // namespace

TEST_F(StackFrameRecognizerTest, NullModuleRegex) {
  DebuggerSP debugger_sp = Debugger::CreateInstance();
  ASSERT_TRUE(debugger_sp);

  StackFrameRecognizerManager manager;

  RegisterDummyStackFrameRecognizer(manager);

  bool any_printed = false;
  manager.ForEach([&any_printed](uint32_t recognizer_id, bool enabled,
                                 std::string name, std::string function,
                                 llvm::ArrayRef<ConstString> symbols,
                                 Mangled::NamePreference symbol_mangling,
                                 bool regexp) { any_printed = true; });

  EXPECT_TRUE(any_printed);
}
