// Part of the Crubit project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

#include "common/test_utils.h"

#include <string>
#include <vector>

#include "gtest/gtest.h"
#include "absl/log/check.h"
#include "common/file_io.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"

namespace crubit {

static std::string MakeTmpdirForCurrentTest() {
  absl::string_view current_test_name =
      testing::UnitTest::GetInstance()->current_test_info()->name();
  std::string current_test_tmpdir_path =
      absl::StrCat(testing::TempDir(), "/", current_test_name, "/");
  llvm::StringRef parent_dir =
      llvm::sys::path::parent_path(current_test_tmpdir_path);
  CHECK(!llvm::sys::fs::create_directories(parent_dir));
  return current_test_tmpdir_path;
}

std::string WriteFileForCurrentTest(absl::string_view filename,
                                    absl::string_view content) {
  std::string path = absl::StrCat(MakeTmpdirForCurrentTest(), "/", filename);
  CHECK(SetFileContents(path, content).ok());
  return path;
}

std::vector<std::string> DefaultClangArgs() {
  return {"-I", MakeTmpdirForCurrentTest()};
}

}  // namespace crubit
