summaryrefslogtreecommitdiffstats
path: root/intl/locale/tests/gtest/TestCollation.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--intl/locale/tests/gtest/TestCollation.cpp157
1 files changed, 157 insertions, 0 deletions
diff --git a/intl/locale/tests/gtest/TestCollation.cpp b/intl/locale/tests/gtest/TestCollation.cpp
new file mode 100644
index 0000000000..4085f6433f
--- /dev/null
+++ b/intl/locale/tests/gtest/TestCollation.cpp
@@ -0,0 +1,157 @@
+/* -*- 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 "nsCollationCID.h"
+#include "nsComponentManagerUtils.h"
+#include "nsCOMPtr.h"
+#include "nsICollation.h"
+#include "nsString.h"
+#include "nsTArray.h"
+
+TEST(Collation, AllocateRowSortKey)
+{
+ nsCOMPtr<nsICollationFactory> colFactory =
+ do_CreateInstance(NS_COLLATIONFACTORY_CONTRACTID);
+ ASSERT_TRUE(colFactory);
+
+ // Don't throw error even if locale name is invalid
+ nsCOMPtr<nsICollation> collator;
+ nsresult rv = colFactory->CreateCollationForLocale("$languageName"_ns,
+ getter_AddRefs(collator));
+ ASSERT_TRUE(NS_SUCCEEDED(rv));
+
+ nsTArray<uint8_t> sortKey1;
+ // Don't throw error even if locale name is invalid
+ rv = collator->AllocateRawSortKey(nsICollation::kCollationStrengthDefault,
+ u"ABC"_ns, sortKey1);
+ ASSERT_TRUE(NS_SUCCEEDED(rv));
+
+ nsTArray<uint8_t> sortKey2;
+ // Don't throw error even if locale name is invalid
+ rv = collator->AllocateRawSortKey(nsICollation::kCollationStrengthDefault,
+ u"DEF"_ns, sortKey2);
+ ASSERT_TRUE(NS_SUCCEEDED(rv));
+
+ int32_t result;
+ rv = collator->CompareRawSortKey(sortKey1, sortKey2, &result);
+ ASSERT_TRUE(NS_SUCCEEDED(rv));
+
+ ASSERT_TRUE(result < 0);
+}
+
+class CollationComparator final {
+ public:
+ explicit CollationComparator(nsICollation* aCollation)
+ : mCollation(aCollation) {}
+
+ bool Equals(const nsString& a, const nsString& b) const {
+ int32_t result = 0;
+ mCollation->CompareString(nsICollation::kCollationStrengthDefault, a, b,
+ &result);
+ return result == 0;
+ }
+
+ bool LessThan(const nsString& a, const nsString& b) const {
+ int32_t result = 0;
+ mCollation->CompareString(nsICollation::kCollationStrengthDefault, a, b,
+ &result);
+ return result < 0;
+ }
+
+ private:
+ nsCOMPtr<nsICollation> mCollation;
+};
+
+TEST(Collation, CompareString)
+{
+ nsTArray<nsString> input;
+ input.AppendElement(u"Argentina"_ns);
+ input.AppendElement(u"Oerlikon"_ns);
+ input.AppendElement(u"Offenbach"_ns);
+ input.AppendElement(u"Sverige"_ns);
+ input.AppendElement(u"Vaticano"_ns);
+ input.AppendElement(u"Zimbabwe"_ns);
+ input.AppendElement(u"la France"_ns);
+ input.AppendElement(u"\u00a1viva Espa\u00f1a!"_ns);
+ input.AppendElement(u"\u00d6sterreich"_ns);
+ input.AppendElement(u"\u4e2d\u56fd"_ns);
+ input.AppendElement(u"\u65e5\u672c"_ns);
+ input.AppendElement(u"\ud55c\uad6d"_ns);
+
+ nsCOMPtr<nsICollationFactory> colFactory =
+ do_CreateInstance(NS_COLLATIONFACTORY_CONTRACTID);
+ ASSERT_TRUE(colFactory);
+
+ // Locale en-US; default options.
+ nsCOMPtr<nsICollation> collation;
+ colFactory->CreateCollationForLocale("en-US"_ns, getter_AddRefs(collation));
+ ASSERT_TRUE(collation);
+
+ {
+ CollationComparator comparator(collation);
+ input.Sort(comparator);
+
+ ASSERT_TRUE(input[0].Equals(u"\u00a1viva Espa\u00f1a!"_ns));
+ ASSERT_TRUE(input[1].Equals(u"Argentina"_ns));
+ ASSERT_TRUE(input[2].Equals(u"la France"_ns));
+ ASSERT_TRUE(input[3].Equals(u"Oerlikon"_ns));
+ ASSERT_TRUE(input[4].Equals(u"Offenbach"_ns));
+ ASSERT_TRUE(input[5].Equals(u"\u00d6sterreich"_ns));
+ ASSERT_TRUE(input[6].Equals(u"Sverige"_ns));
+ ASSERT_TRUE(input[7].Equals(u"Vaticano"_ns));
+ ASSERT_TRUE(input[8].Equals(u"Zimbabwe"_ns));
+ ASSERT_TRUE(input[9].Equals(u"\ud55c\uad6d"_ns));
+ ASSERT_TRUE(input[10].Equals(u"\u4e2d\u56fd"_ns));
+ ASSERT_TRUE(input[11].Equals(u"\u65e5\u672c"_ns));
+ }
+
+ // Locale sv-SE; default options.
+ // Swedish treats "Ö" as a separate character, which sorts after "Z".
+ colFactory->CreateCollationForLocale("sv-SE"_ns, getter_AddRefs(collation));
+ ASSERT_TRUE(collation);
+
+ {
+ CollationComparator comparator(collation);
+ input.Sort(comparator);
+
+ ASSERT_TRUE(input[0].Equals(u"\u00a1viva Espa\u00f1a!"_ns));
+ ASSERT_TRUE(input[1].Equals(u"Argentina"_ns));
+ ASSERT_TRUE(input[2].Equals(u"la France"_ns));
+ ASSERT_TRUE(input[3].Equals(u"Oerlikon"_ns));
+ ASSERT_TRUE(input[4].Equals(u"Offenbach"_ns));
+ ASSERT_TRUE(input[5].Equals(u"Sverige"_ns));
+ ASSERT_TRUE(input[6].Equals(u"Vaticano"_ns));
+ ASSERT_TRUE(input[7].Equals(u"Zimbabwe"_ns));
+ ASSERT_TRUE(input[8].Equals(u"\u00d6sterreich"_ns));
+ ASSERT_TRUE(input[9].Equals(u"\ud55c\uad6d"_ns));
+ ASSERT_TRUE(input[10].Equals(u"\u4e2d\u56fd"_ns));
+ ASSERT_TRUE(input[11].Equals(u"\u65e5\u672c"_ns));
+ }
+
+ // Locale de-DE; default options.
+ // In German standard sorting, umlauted characters are treated as variants
+ // of their base characters: ä ≅ a, ö ≅ o, ü ≅ u.
+ colFactory->CreateCollationForLocale("de-DE"_ns, getter_AddRefs(collation));
+ ASSERT_TRUE(collation);
+
+ {
+ CollationComparator comparator(collation);
+ input.Sort(comparator);
+
+ ASSERT_TRUE(input[0].Equals(u"\u00a1viva Espa\u00f1a!"_ns));
+ ASSERT_TRUE(input[1].Equals(u"Argentina"_ns));
+ ASSERT_TRUE(input[2].Equals(u"la France"_ns));
+ ASSERT_TRUE(input[3].Equals(u"Oerlikon"_ns));
+ ASSERT_TRUE(input[4].Equals(u"Offenbach"_ns));
+ ASSERT_TRUE(input[5].Equals(u"\u00d6sterreich"_ns));
+ ASSERT_TRUE(input[6].Equals(u"Sverige"_ns));
+ ASSERT_TRUE(input[7].Equals(u"Vaticano"_ns));
+ ASSERT_TRUE(input[8].Equals(u"Zimbabwe"_ns));
+ ASSERT_TRUE(input[9].Equals(u"\ud55c\uad6d"_ns));
+ ASSERT_TRUE(input[10].Equals(u"\u4e2d\u56fd"_ns));
+ ASSERT_TRUE(input[11].Equals(u"\u65e5\u672c"_ns));
+ }
+}