/*
 *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include <algorithm>
#include <cstddef>
#include <memory>
#include <string>
#include <vector>

#include "absl/debugging/failure_signal_handler.h"
#include "absl/debugging/symbolize.h"
#include "absl/flags/parse.h"
#include "test/gmock.h"
#include "test/test_main_lib.h"

namespace {

std::vector<std::string> ReplaceDashesWithUnderscores(int argc, char* argv[]) {
  std::vector<std::string> args(argv, argv + argc);
  for (std::string& arg : args) {
    // Only replace arguments that starts with a dash.
    if (!arg.empty() && arg[0] == '-') {
      // Don't replace the 2 first characters.
      auto begin = arg.begin() + 2;
      // Replace dashes on the left of '=' or on all the arg if no '=' is found.
      auto end = std::find(arg.begin(), arg.end(), '=');
      std::replace(begin, end, '-', '_');
    }
  }
  return args;
}

std::vector<char*> VectorOfStringsToVectorOfPointers(
    std::vector<std::string>& input) {
  std::vector<char*> output(input.size());
  for (size_t i = 0; i < input.size(); ++i) {
    output[i] = &(input[i][0]);
  }
  return output;
}

}  // namespace

int main(int argc, char* argv[]) {
  // Initialize the symbolizer to get a human-readable stack trace
  absl::InitializeSymbolizer(argv[0]);
  testing::InitGoogleMock(&argc, argv);
  // Before parsing the arguments with the absl flag library, any internal '-'
  // characters will be converted to '_' characters to make sure the string is a
  // valid attribute name.
  std::vector<std::string> new_argv = ReplaceDashesWithUnderscores(argc, argv);
  std::vector<char*> raw_new_argv = VectorOfStringsToVectorOfPointers(new_argv);
  absl::ParseCommandLine(argc, &raw_new_argv[0]);

// This absl handler use unsupported features/instructions on Fuchsia
#if !defined(WEBRTC_FUCHSIA)
  absl::FailureSignalHandlerOptions options;
  absl::InstallFailureSignalHandler(options);
#endif

  std::unique_ptr<webrtc::TestMain> main = webrtc::TestMain::Create();
  int err_code = main->Init();
  if (err_code != 0) {
    return err_code;
  }
  return main->Run(argc, argv);
}
