// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "extensions/common/error_utils.h"

#include <string_view>

#include "base/strings/utf_string_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace extensions {
namespace {

// Tests ErrorUtils::FormatErrorMessage which takes two placeholders.
TEST(ErrorUtils, FormatErrorMessage_Success) {
  struct {
    std::string_view format;
    std::string_view s1;
    std::string_view s2;
    const char* expected;
  } cases[] = {
      {"Hello * Bye *", "arg1", "arg2", "Hello arg1 Bye arg2"},
      // Ensure substitutions respect the size of the string_view.
      {"Hello * Bye *", std::string_view("12345", 2), "3", "Hello 12 Bye 3"},
      // Regression test for crbug.com/928415.
      {"Hello * Bye *", "*arg1", "*arg2", "Hello *arg1 Bye *arg2"},
  };

  for (const auto& test_case : cases) {
    SCOPED_TRACE(test_case.format);

    EXPECT_EQ(test_case.expected,
              ErrorUtils::FormatErrorMessage(test_case.format, test_case.s1,
                                             test_case.s2));
    EXPECT_EQ(base::UTF8ToUTF16(test_case.expected),
              ErrorUtils::FormatErrorMessageUTF16(test_case.format,
                                                  test_case.s1, test_case.s2));
  }
}

#if defined(GTEST_HAS_DEATH_TEST)
// Tests that we raise an error if the number of placeholders and substitution
// arguments are not equal.
TEST(ErrorUtils, FormatErrorMessage_Death) {
  struct {
    std::string_view format;
    std::string_view s1;
    std::string_view s2;
    const char* death_message_regex;
  } cases[] = {{"Hello * Bye * *", "arg1", "arg2", "More placeholders"},
               {"Hello * Bye", "arg1", "arg2", "Fewer placeholders"}};

  auto get_death_regex = [](const char* death_message_regex) {
// String arguments aren't passed to CHECK() in official builds.
#if defined(OFFICIAL_BUILD) && defined(NDEBUG)
    return "";
#else
    return death_message_regex;
#endif
  };

  for (const auto& test_case : cases) {
    SCOPED_TRACE(test_case.format);

    EXPECT_DEATH(ErrorUtils::FormatErrorMessage(test_case.format, test_case.s1,
                                                test_case.s2),
                 get_death_regex(test_case.death_message_regex));
    EXPECT_DEATH(ErrorUtils::FormatErrorMessageUTF16(
                     test_case.format, test_case.s1, test_case.s2),
                 get_death_regex(test_case.death_message_regex));
  }
}
#endif  // defined(GTEST_HAS_DEATH_TEST)

}  // namespace
}  // namespace extensions
