// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <filesystem>
#include <fstream>
#include <string>
#include <string_view>

#include <gtest/gtest.h>

#include "src/developer/debug/zxdb/common/host_util.h"
#include "tools/symbolizer/log_parser.h"
#include "tools/symbolizer/symbolizer_impl.h"

namespace {

const std::filesystem::path kSelfPath = zxdb::GetSelfPath();
const std::filesystem::path kFuchsiaSrcDir =
    kSelfPath.parent_path().parent_path().parent_path().parent_path();
const std::filesystem::path kSymbolsDir =
    kFuchsiaSrcDir / "prebuilt" / "test_data" / "symbolizer" / "symbols";
const std::filesystem::path kTestCasesDir = kFuchsiaSrcDir / "tools" / "symbolizer" / "test_cases";

class TestCase : public testing::Test {
 public:
  explicit TestCase(const std::string& name) : name_(name) {}
  void TestBody() override {
    symbolizer::CommandLineOptions options;
    options.build_id_dirs.push_back(kSymbolsDir);

    std::stringstream output;
    symbolizer::Printer printer(output);
    symbolizer::SymbolizerImpl symbolizer(&printer, options);

    std::ifstream input(kTestCasesDir / (name_ + ".in"));
    std::ifstream expected_output(kTestCasesDir / (name_ + ".out"));
    symbolizer::LogParser parser(input, &printer, &symbolizer);

    while (parser.ProcessNextLine()) {
      std::string got;
      while (std::getline(output, got)) {
        std::string expected;
        EXPECT_TRUE(std::getline(expected_output, expected));
        EXPECT_EQ(got, expected);
      }
      // Reset the output buffer.
      output.clear();
      output.str("");
    }
  }

 private:
  std::string name_;
};

void SetupTests() {
  for (const auto& entry : std::filesystem::directory_iterator(kTestCasesDir)) {
    if (entry.path().extension() == ".in") {
      std::string name = entry.path().stem();
      ::testing::RegisterTest("E2ETest", name.c_str(), nullptr, nullptr, __FILE__, __LINE__,
                              [name]() { return new TestCase(name); });
    }
  }
}

}  // namespace

int main(int argc, char** argv) {
  SetupTests();
  ::testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}
