Source code

Revision control

Copy as Markdown

Other Tools

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "gtest/gtest.h"
#include "mozilla/ArrayUtils.h"
#include "mozilla/gtest/MozAssertions.h"
#include "mozilla/Preferences.h"
#include "mozilla/intl/LocaleService.h"
#include "mozilla/intl/OSPreferences.h"
using namespace mozilla::intl;
/**
* We test that on all platforms we test against (irrelevant of the tier),
* we will be able to retrieve at least a single locale out of the system.
*
* In theory, that may not be true, but if we encounter such platform we should
* decide how to handle this and special case and this test should make
* it not happen without us noticing.
*/
TEST(Intl_Locale_OSPreferences, GetSystemLocales)
{
nsTArray<nsCString> systemLocales;
ASSERT_TRUE(NS_SUCCEEDED(
OSPreferences::GetInstance()->GetSystemLocales(systemLocales)));
ASSERT_FALSE(systemLocales.IsEmpty());
}
/**
* We test that on all platforms we test against (irrelevant of the tier),
* we will be able to retrieve at least a single locale out of the system.
*
* In theory, that may not be true, but if we encounter such platform we should
* decide how to handle this and special case and this test should make
* it not happen without us noticing.
*/
TEST(Intl_Locale_OSPreferences, GetRegionalPrefsLocales)
{
nsTArray<nsCString> rgLocales;
ASSERT_TRUE(NS_SUCCEEDED(
OSPreferences::GetInstance()->GetRegionalPrefsLocales(rgLocales)));
ASSERT_FALSE(rgLocales.IsEmpty());
}
/**
* We test that on all platforms we test against,
* we will be able to retrieve a date and time pattern.
*
* This may come back empty on platforms where we don't have platforms
* bindings for, so effectively, we're testing for crashes. We should
* never crash.
*/
TEST(Intl_Locale_OSPreferences, GetDateTimePattern)
{
nsAutoCString pattern;
OSPreferences* osprefs = OSPreferences::GetInstance();
struct Test {
int dateStyle;
int timeStyle;
const char* locale;
};
Test tests[] = {{0, 0, ""}, {1, 0, "pl"}, {2, 0, "de-DE"}, {3, 0, "fr"},
{4, 0, "ar"},
{0, 1, ""}, {0, 2, "it"}, {0, 3, ""}, {0, 4, "ru"},
{4, 1, ""}, {3, 2, "cs"}, {2, 3, ""}, {1, 4, "ja"}};
for (unsigned i = 0; i < std::size(tests); i++) {
const Test& t = tests[i];
if (NS_SUCCEEDED(osprefs->GetDateTimePattern(
t.dateStyle, t.timeStyle, nsDependentCString(t.locale), pattern))) {
ASSERT_TRUE((t.dateStyle == 0 && t.timeStyle == 0) || !pattern.IsEmpty());
}
}
// If the locale is not specified, we should get the pattern corresponding to
// the first regional prefs locale.
AutoTArray<nsCString, 10> rpLocales;
LocaleService::GetInstance()->GetRegionalPrefsLocales(rpLocales);
ASSERT_TRUE(rpLocales.Length() > 0);
nsAutoCString rpLocalePattern;
ASSERT_TRUE(NS_SUCCEEDED(
osprefs->GetDateTimePattern(mozIOSPreferences::dateTimeFormatStyleLong,
mozIOSPreferences::dateTimeFormatStyleLong,
rpLocales[0], rpLocalePattern)));
ASSERT_TRUE(NS_SUCCEEDED(
osprefs->GetDateTimePattern(mozIOSPreferences::dateTimeFormatStyleLong,
mozIOSPreferences::dateTimeFormatStyleLong,
nsDependentCString(""), pattern)));
ASSERT_EQ(rpLocalePattern, pattern);
}
/**
* Test that is possible to override the OS defaults through a pref.
*/
TEST(Intl_Locale_OSPreferences, GetDateTimePatternPrefOverrides)
{
nsresult nr;
nsAutoCString default_pattern, pattern;
OSPreferences* osprefs = OSPreferences::GetInstance();
struct {
const char* DatePref;
const char* TimePref;
int32_t DateTimeFormatStyle;
} configs[] = {{"intl.date_time.pattern_override.date_short",
"intl.date_time.pattern_override.time_short",
mozIOSPreferences::dateTimeFormatStyleShort},
{"intl.date_time.pattern_override.date_medium",
"intl.date_time.pattern_override.time_medium",
mozIOSPreferences::dateTimeFormatStyleMedium},
{"intl.date_time.pattern_override.date_long",
"intl.date_time.pattern_override.time_long",
mozIOSPreferences::dateTimeFormatStyleLong},
{"intl.date_time.pattern_override.date_full",
"intl.date_time.pattern_override.time_full",
mozIOSPreferences::dateTimeFormatStyleFull}};
for (const auto& config : configs) {
// Get default value for the OS
nr = osprefs->GetDateTimePattern(config.DateTimeFormatStyle,
mozIOSPreferences::dateTimeFormatStyleNone,
nsDependentCString(""), default_pattern);
ASSERT_NS_SUCCEEDED(nr);
// Override date format
mozilla::Preferences::SetCString(config.DatePref, "yy-MM");
nr = osprefs->GetDateTimePattern(config.DateTimeFormatStyle,
mozIOSPreferences::dateTimeFormatStyleNone,
nsDependentCString(""), pattern);
ASSERT_NS_SUCCEEDED(nr);
ASSERT_TRUE(pattern.EqualsASCII("yy-MM"));
// Override time format
mozilla::Preferences::SetCString(config.TimePref, "HH:mm");
nr = osprefs->GetDateTimePattern(mozIOSPreferences::dateTimeFormatStyleNone,
config.DateTimeFormatStyle,
nsDependentCString(""), pattern);
ASSERT_NS_SUCCEEDED(nr);
ASSERT_TRUE(pattern.EqualsASCII("HH:mm"));
// Override both
nr = osprefs->GetDateTimePattern(config.DateTimeFormatStyle,
config.DateTimeFormatStyle,
nsDependentCString(""), pattern);
ASSERT_NS_SUCCEEDED(nr);
ASSERT_TRUE(pattern.Find("yy-MM") != kNotFound);
ASSERT_TRUE(pattern.Find("HH:mm") != kNotFound);
// Clear overrides, we should get the default value back.
mozilla::Preferences::ClearUser(config.DatePref);
mozilla::Preferences::ClearUser(config.TimePref);
nr = osprefs->GetDateTimePattern(config.DateTimeFormatStyle,
mozIOSPreferences::dateTimeFormatStyleNone,
nsDependentCString(""), pattern);
ASSERT_NS_SUCCEEDED(nr);
ASSERT_EQ(default_pattern, pattern);
}
// Test overriding connector
nr = osprefs->GetDateTimePattern(mozIOSPreferences::dateTimeFormatStyleShort,
mozIOSPreferences::dateTimeFormatStyleShort,
nsDependentCString(""), default_pattern);
mozilla::Preferences::SetCString("intl.date_time.pattern_override.date_short",
"yyyy-MM-dd");
mozilla::Preferences::SetCString("intl.date_time.pattern_override.time_short",
"HH:mm:ss");
mozilla::Preferences::SetCString(
"intl.date_time.pattern_override.connector_short", "{1} {0}");
nr = osprefs->GetDateTimePattern(mozIOSPreferences::dateTimeFormatStyleShort,
mozIOSPreferences::dateTimeFormatStyleShort,
nsDependentCString(""), pattern);
ASSERT_NS_SUCCEEDED(nr);
ASSERT_TRUE(pattern.EqualsASCII("yyyy-MM-dd HH:mm:ss"));
// Reset to date and time to defaults
mozilla::Preferences::ClearUser("intl.date_time.pattern_override.date_short");
mozilla::Preferences::ClearUser("intl.date_time.pattern_override.time_short");
// Invalid patterns are ignored
mozilla::Preferences::SetCString(
"intl.date_time.pattern_override.connector_short", "hello, world!");
nr = osprefs->GetDateTimePattern(mozIOSPreferences::dateTimeFormatStyleShort,
mozIOSPreferences::dateTimeFormatStyleShort,
nsDependentCString(""), pattern);
ASSERT_NS_SUCCEEDED(nr);
ASSERT_EQ(default_pattern, pattern);
// Clearing the override results in getting the default pattern back.
mozilla::Preferences::ClearUser(
"intl.date_time.pattern_override.connector_short");
nr = osprefs->GetDateTimePattern(mozIOSPreferences::dateTimeFormatStyleShort,
mozIOSPreferences::dateTimeFormatStyleShort,
nsDependentCString(""), pattern);
ASSERT_NS_SUCCEEDED(nr);
ASSERT_EQ(default_pattern, pattern);
}