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

#ifdef UNSAFE_BUFFERS_BUILD
// TODO(crbug.com/390223051): Remove C-library calls to fix the errors.
#pragma allow_unsafe_libc_calls
#endif

#include "base/strings/utf_string_conversions.h"

#include <stddef.h>

#include "base/strings/string_util.h"
#include "build/build_config.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace base {

namespace {

const wchar_t* const kConvertRoundtripCases[] = {
    L"Google Video",
    // "网页 图片 资讯更多 »"
    L"\x7f51\x9875\x0020\x56fe\x7247\x0020\x8d44\x8baf\x66f4\x591a\x0020\x00bb",
    //  "Παγκόσμιος Ιστός"
    L"\x03a0\x03b1\x03b3\x03ba\x03cc\x03c3\x03bc\x03b9"
    L"\x03bf\x03c2\x0020\x0399\x03c3\x03c4\x03cc\x03c2",
    // "Поиск страниц на русском"
    L"\x041f\x043e\x0438\x0441\x043a\x0020\x0441\x0442"
    L"\x0440\x0430\x043d\x0438\x0446\x0020\x043d\x0430"
    L"\x0020\x0440\x0443\x0441\x0441\x043a\x043e\x043c",
    // "전체서비스"
    L"\xc804\xccb4\xc11c\xbe44\xc2a4",

// Test characters that take more than 16 bits. This will depend on whether
// wchar_t is 16 or 32 bits.
#if defined(WCHAR_T_IS_16_BIT)
    L"\xd800\xdf00",
    // ?????  (Mathematical Alphanumeric Symbols (U+011d40 - U+011d44 :
    // A,B,C,D,E)
    L"\xd807\xdd40\xd807\xdd41\xd807\xdd42\xd807\xdd43\xd807\xdd44",
#elif defined(WCHAR_T_IS_32_BIT)
    L"\x10300",
    // ?????  (Mathematical Alphanumeric Symbols (U+011d40 - U+011d44 :
    // A,B,C,D,E)
    L"\x11d40\x11d41\x11d42\x11d43\x11d44",
#endif
};

}  // namespace

TEST(UTFStringConversionsTest, ConvertUTF8AndWide) {
  // we round-trip all the wide strings through UTF-8 to make sure everything
  // agrees on the conversion. This uses the stream operators to test them
  // simultaneously.
  for (auto* i : kConvertRoundtripCases) {
    std::ostringstream utf8;
    utf8 << WideToUTF8(i);
    std::wostringstream wide;
    wide << UTF8ToWide(utf8.str());

    EXPECT_EQ(i, wide.str());
  }
}

TEST(UTFStringConversionsTest, ConvertUTF8AndWideEmptyString) {
  // An empty std::wstring should be converted to an empty std::string,
  // and vice versa.
  std::wstring wempty;
  std::string empty;
  EXPECT_EQ(empty, WideToUTF8(wempty));
  EXPECT_EQ(wempty, UTF8ToWide(empty));
}

TEST(UTFStringConversionsTest, ConvertUTF8ToWide) {
  struct UTF8ToWideCase {
    const char* utf8;
    const wchar_t* wide;
    bool success;
  } convert_cases[] = {
      // Regular UTF-8 input.
      {"\xe4\xbd\xa0\xe5\xa5\xbd", L"\x4f60\x597d", true},
      // Non-character is passed through.
      {"\xef\xbf\xbfHello", L"\xffffHello", true},
      // Truncated UTF-8 sequence.
      {"\xe4\xa0\xe5\xa5\xbd", L"\xfffd\x597d", false},
      // Truncated off the end.
      {"\xe5\xa5\xbd\xe4\xa0", L"\x597d\xfffd", false},
      // Non-shortest-form UTF-8.
      {"\xf0\x84\xbd\xa0\xe5\xa5\xbd", L"\xfffd\xfffd\xfffd\xfffd\x597d",
       false},
      // This UTF-8 character decodes to a UTF-16 surrogate, which is illegal.
      {"\xed\xb0\x80", L"\xfffd\xfffd\xfffd", false},
  // Non-BMP characters. The second is a non-character regarded as valid.
  // The result will either be in UTF-16 or UTF-32.
#if defined(WCHAR_T_IS_16_BIT)
      {"A\xF0\x90\x8C\x80z", L"A\xd800\xdf00z", true},
      {"A\xF4\x8F\xBF\xBEz", L"A\xdbff\xdffez", true},
#elif defined(WCHAR_T_IS_32_BIT)
      {"A\xF0\x90\x8C\x80z", L"A\x10300z", true},
      {"A\xF4\x8F\xBF\xBEz", L"A\x10fffez", true},
#endif
  };

  for (const auto& i : convert_cases) {
    std::wstring converted;
    EXPECT_EQ(i.success, UTF8ToWide(i.utf8, strlen(i.utf8), &converted));
    std::wstring expected(i.wide);
    EXPECT_EQ(expected, converted);
  }

  // Manually test an embedded NULL.
  std::wstring converted;
  EXPECT_TRUE(UTF8ToWide("\00Z\t", 3, &converted));
  ASSERT_EQ(3U, converted.length());
  EXPECT_EQ(static_cast<wchar_t>(0), converted[0]);
  EXPECT_EQ('Z', converted[1]);
  EXPECT_EQ('\t', converted[2]);

  // Make sure that conversion replaces, not appends.
  EXPECT_TRUE(UTF8ToWide("B", 1, &converted));
  ASSERT_EQ(1U, converted.length());
  EXPECT_EQ('B', converted[0]);
}

#if defined(WCHAR_T_IS_16_BIT)
// This test is only valid when wchar_t == UTF-16.
TEST(UTFStringConversionsTest, ConvertUTF16ToUTF8) {
  struct WideToUTF8Case {
    const wchar_t* utf16;
    const char* utf8;
    bool success;
  } convert_cases[] = {
      // Regular UTF-16 input.
      {L"\x4f60\x597d", "\xe4\xbd\xa0\xe5\xa5\xbd", true},
      // Test a non-BMP character.
      {L"\xd800\xdf00", "\xF0\x90\x8C\x80", true},
      // Non-characters are passed through.
      {L"\xffffHello", "\xEF\xBF\xBFHello", true},
      {L"\xdbff\xdffeHello", "\xF4\x8F\xBF\xBEHello", true},
      // The first character is a truncated UTF-16 character.
      {L"\xd800\x597d", "\xef\xbf\xbd\xe5\xa5\xbd", false},
      // Truncated at the end.
      {L"\x597d\xd800", "\xe5\xa5\xbd\xef\xbf\xbd", false},
  };

  for (const auto& test : convert_cases) {
    std::string converted;
    EXPECT_EQ(test.success,
              WideToUTF8(test.utf16, wcslen(test.utf16), &converted));
    std::string expected(test.utf8);
    EXPECT_EQ(expected, converted);
  }
}

#elif defined(WCHAR_T_IS_32_BIT)
// This test is only valid when wchar_t == UTF-32.
TEST(UTFStringConversionsTest, ConvertUTF32ToUTF8) {
  struct WideToUTF8Case {
    const wchar_t* utf32;
    const char* utf8;
    bool success;
  } convert_cases[] = {
      // Regular 16-bit input.
      {L"\x4f60\x597d", "\xe4\xbd\xa0\xe5\xa5\xbd", true},
      // Test a non-BMP character.
      {L"A\x10300z", "A\xF0\x90\x8C\x80z", true},
      // Non-characters are passed through.
      {L"\xffffHello", "\xEF\xBF\xBFHello", true},
      {L"\x10fffeHello", "\xF4\x8F\xBF\xBEHello", true},
      // Invalid Unicode code points.
      {L"\xfffffffHello", "\xEF\xBF\xBDHello", false},
      // The first character is a truncated UTF-16 character.
      {L"\xd800\x597d", "\xef\xbf\xbd\xe5\xa5\xbd", false},
      {L"\xdc01Hello", "\xef\xbf\xbdHello", false},
  };

  for (const auto& test : convert_cases) {
    std::string converted;
    EXPECT_EQ(test.success,
              WideToUTF8(test.utf32, wcslen(test.utf32), &converted));
    std::string expected(test.utf8);
    EXPECT_EQ(expected, converted);
  }
}
#endif  // defined(WCHAR_T_IS_32_BIT)

TEST(UTFStringConversionsTest, ConvertMultiString) {
  // `operator""s` will avoid truncating the strings at the first embedded NUL.
  using std::string_literals::operator""s;
  std::u16string multistring16 = u"foo\0bar\0baz\0"s;
  std::string expected = "foo\0bar\0baz\0"s;
  ASSERT_EQ(12u, multistring16.size());
  ASSERT_EQ(12u, expected.size());

  EXPECT_EQ(expected, UTF16ToUTF8(multistring16));
}

}  // namespace base
