1/*
2 * Copyright 2014 Haiku, Inc.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include "CollatorTest.h"
8
9#include <Collator.h>
10#include <Locale.h>
11#include <LocaleRoster.h>
12
13#include <cppunit/TestCaller.h>
14#include <cppunit/TestSuite.h>
15
16
17CollatorTest::CollatorTest()
18{
19}
20
21
22CollatorTest::~CollatorTest()
23{
24}
25
26
27void
28CollatorTest::TestSortKeys()
29{
30	struct Test {
31		char* first;
32		char* second;
33		int sign[3];
34	};
35
36	BCollator collator;
37	BLocaleRoster::Default()->GetDefaultLocale()->GetCollator(&collator);
38	const Test tests[] = {
39		{"gehen", "g��hen", {0, -1, -1}},
40		{"aus", "��U��", {-1, -1, -1}},
41		{"auss", "��U��", {0, -1, -1}},
42		{"WO", "w��", {0, -1, -1}},
43		{"SO", "so", {0, 0, 1}},
44		{"a����", "acn", {0, 1, 1}},
45		{NULL, NULL, {0, 0, 0}}
46	};
47
48	for (int32 i = 0; tests[i].first != NULL; i++) {
49		NextSubTest();
50
51		for (int32 strength = B_COLLATE_PRIMARY; strength < 4; strength++) {
52			BString a, b;
53			collator.SetStrength(strength);
54			collator.GetSortKey(tests[i].first, &a);
55			collator.GetSortKey(tests[i].second, &b);
56
57			int difference = collator.Compare(tests[i].first, tests[i].second);
58			CPPUNIT_ASSERT_EQUAL(tests[i].sign[strength - 1], difference);
59			int keydiff = strcmp(a.String(), b.String());
60			// Check that the keys compare the same as the strings. Either both
61			// are 0, or both have the same sign.
62			if (difference == 0)
63				CPPUNIT_ASSERT_EQUAL(0, keydiff);
64			else
65				CPPUNIT_ASSERT(keydiff * difference > 0);
66		}
67	}
68}
69
70
71/*static*/ void
72CollatorTest::AddTests(BTestSuite& parent)
73{
74	CppUnit::TestSuite& suite = *new CppUnit::TestSuite("CollatorTest");
75
76	suite.addTest(new CppUnit::TestCaller<CollatorTest>(
77		"CollatorTest::TestSortKeys", &CollatorTest::TestSortKeys));
78
79	parent.addTest("CollatorTest", &suite);
80}
81