diff options
author | Elliott Hughes <enh@google.com> | 2014-04-08 17:05:05 -0700 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2014-04-08 19:37:38 -0700 |
commit | c4936e20a3a8772cc393423037be36091e68acc2 (patch) | |
tree | 17df342ad605fcb25812936a34d68e3f225b387e /tests/locale_test.cpp | |
parent | ac70d2e1fe71f98232942237c2b463ea3adbf662 (diff) | |
download | android_bionic-c4936e20a3a8772cc393423037be36091e68acc2.tar.gz android_bionic-c4936e20a3a8772cc393423037be36091e68acc2.tar.bz2 android_bionic-c4936e20a3a8772cc393423037be36091e68acc2.zip |
Flesh out <locale.h>.
This is a trivial implementation that only supports the C/POSIX locale.
Change-Id: Ib11cea4249e1862aca96a8b94d58ea9a418cbe75
Diffstat (limited to 'tests/locale_test.cpp')
-rw-r--r-- | tests/locale_test.cpp | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/tests/locale_test.cpp b/tests/locale_test.cpp index 87dd63197..347b5b19d 100644 --- a/tests/locale_test.cpp +++ b/tests/locale_test.cpp @@ -16,6 +16,7 @@ #include <gtest/gtest.h> +#include <errno.h> #include <limits.h> #include <locale.h> @@ -45,3 +46,62 @@ TEST(locale, localeconv) { EXPECT_EQ(CHAR_MAX, localeconv()->int_p_sign_posn); EXPECT_EQ(CHAR_MAX, localeconv()->int_n_sign_posn); } + +TEST(locale, setlocale) { + EXPECT_STREQ("C", setlocale(LC_ALL, NULL)); + EXPECT_STREQ("C", setlocale(LC_CTYPE, NULL)); + + errno = 0; + EXPECT_EQ(NULL, setlocale(-1, NULL)); + EXPECT_EQ(EINVAL, errno); + errno = 0; + EXPECT_EQ(NULL, setlocale(13, NULL)); + EXPECT_EQ(EINVAL, errno); + +#if __BIONIC__ + // The "" locale is implementation-defined. For bionic, it's the C locale. + // glibc will give us something like "en_US.UTF-8", depending on the user's configuration. + EXPECT_STREQ("C", setlocale(LC_ALL, "")); +#endif + EXPECT_STREQ("C", setlocale(LC_ALL, "C")); + EXPECT_STREQ("C", setlocale(LC_ALL, "POSIX")); + + errno = 0; + EXPECT_EQ(NULL, setlocale(LC_ALL, "this-is-not-a-locale")); + EXPECT_EQ(ENOENT, errno); // POSIX specified, not an implementation detail! +} + +TEST(locale, newlocale) { + errno = 0; + EXPECT_EQ(0, newlocale(1 << 20, "C", 0)); + EXPECT_EQ(EINVAL, errno); + + locale_t l = newlocale(LC_ALL, "C", 0); + ASSERT_TRUE(l != NULL); + freelocale(l); + + errno = 0; + EXPECT_EQ(0, newlocale(LC_ALL, "this-is-not-a-locale", 0)); + EXPECT_EQ(ENOENT, errno); // POSIX specified, not an implementation detail! +} + +TEST(locale, duplocale) { + locale_t cloned_global = duplocale(LC_GLOBAL_LOCALE); + ASSERT_TRUE(cloned_global != NULL); + freelocale(cloned_global); +} + +TEST(locale, uselocale) { + locale_t original = uselocale(NULL); + EXPECT_FALSE(original == 0); + EXPECT_EQ(LC_GLOBAL_LOCALE, original); + + locale_t n = newlocale(LC_ALL, "C", 0); + EXPECT_FALSE(n == 0); + EXPECT_FALSE(n == original); + + locale_t old = uselocale(n); + EXPECT_TRUE(old == original); + + EXPECT_EQ(n, uselocale(NULL)); +} |