// 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.

// This file contains unit tests for Windows internationalization funcs.

#include "base/win/i18n.h"

#include <stddef.h>
#include <string.h>

#include "base/strings/string_util.h"
#include "base/win/windows_version.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace base {
namespace win {
namespace i18n {

// Tests that at least one user preferred UI language can be obtained.
TEST(I18NTest, GetUserPreferredUILanguageList) {
  std::vector<std::wstring> languages;
  EXPECT_TRUE(GetUserPreferredUILanguageList(&languages));
  EXPECT_FALSE(languages.empty());
  for (const auto& language : languages) {
    EXPECT_FALSE(language.empty());
    // Ensure there's no extra trailing 0 characters.
    EXPECT_EQ(language.size(), wcslen(language.c_str()));
  }
}

// Tests that at least one thread preferred UI language can be obtained.
TEST(I18NTest, GetThreadPreferredUILanguageList) {
  std::vector<std::wstring> languages;
  EXPECT_TRUE(GetThreadPreferredUILanguageList(&languages));
  EXPECT_FALSE(languages.empty());
  for (const auto& language : languages) {
    EXPECT_FALSE(language.empty());
    EXPECT_EQ(language.size(), wcslen(language.c_str()));
  }
}

// Tests that GetThreadPreferredUILanguageList appends to the given vector
// rather than replacing it.
TEST(I18NTest, GetUserPreferredUILanguageListAppends) {
  std::vector<std::wstring> languages{std::wstring(L"dummylang")};
  EXPECT_TRUE(GetUserPreferredUILanguageList(&languages));
  ASSERT_GT(languages.size(), 1U);
  EXPECT_EQ(languages[0], L"dummylang");
}

// Tests that GetThreadPreferredUILanguageList appends to the given vector
// rather than replacing it.
TEST(I18NTest, GetThreadPreferredUILanguageListAppends) {
  std::vector<std::wstring> languages{std::wstring(L"dummylang")};
  EXPECT_TRUE(GetThreadPreferredUILanguageList(&languages));
  ASSERT_GT(languages.size(), 1U);
  EXPECT_EQ(languages[0], L"dummylang");
}

}  // namespace i18n
}  // namespace win
}  // namespace base
