xref: /haiku/src/tests/kits/shared/NaturalCompareTest.cpp (revision cbe0a0c436162d78cc3f92a305b64918c839d079)
1 /*
2  * Copyright 2012, Axel Dörfler, axeld@pinc-software.de.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include "NaturalCompareTest.h"
8 
9 #include <NaturalCompare.h>
10 
11 #include <cppunit/TestCaller.h>
12 #include <cppunit/TestSuite.h>
13 
14 
15 using namespace BPrivate;
16 
17 
18 struct Sample {
19 	const char*	a;
20 	const char*	b;
21 	int			expectedResult;
22 };
23 
24 
25 NaturalCompareTest::NaturalCompareTest()
26 {
27 }
28 
29 
30 NaturalCompareTest::~NaturalCompareTest()
31 {
32 }
33 
34 
35 void
36 NaturalCompareTest::TestSome()
37 {
38 	static const Sample samples[] = {
39 		// NULL in either side of the comparison
40 		{NULL, NULL, 0},
41 		{NULL, "A", -1},
42 		{"A", NULL,  1},
43 		// Case insensitive
44 		{"a", "A", 0},
45 		{"é", "É", 0},
46 		// Handling of accented characters
47 		{"ä", "a", 1},
48 		// Natural number ordering
49 		{"3", "99", -1},
50 		{"9", "19", -1},
51 		{"13", "99", -1},
52 		{"9", "111", -1},
53 		{"00000009", "111", -1},
54 		// Natural number ordering, ignoring leading space
55 		{"Hallo2", "hallo12", -1},
56 		{"Hallo 2", "hallo12", -1},
57 		{"Hallo  2", "hallo12", -1},
58 		{"Hallo  2 ", "hallo12", -1},
59 		// A mix of everything
60 		{"12 äber 42", "12aber42", -1},
61 		{"12 äber 42", "12aber43", -1},
62 		{"12 äber 44", "12aber43", -1},
63 		{"12 äber 44", "12 aber45", -1},
64 	};
65 	_RunTests(samples, sizeof(samples) / sizeof(Sample));
66 }
67 
68 
69 /*static*/ void
70 NaturalCompareTest::AddTests(BTestSuite& parent)
71 {
72 	CppUnit::TestSuite& suite = *new CppUnit::TestSuite("NaturalCompareTest");
73 
74 	suite.addTest(new CppUnit::TestCaller<NaturalCompareTest>(
75 		"NaturalCompareTest::TestSome", &NaturalCompareTest::TestSome));
76 
77 	parent.addTest("NaturalCompareTest", &suite);
78 }
79 
80 
81 void
82 NaturalCompareTest::_RunTests(const Sample* samples, int count)
83 {
84 	for (int i = 0; i < count; i++) {
85 		const Sample& sample = samples[i];
86 
87 		_RunTest(sample.a, sample.b, sample.expectedResult);
88 		_RunTest(sample.b, sample.a, -sample.expectedResult);
89 	}
90 }
91 
92 
93 void
94 NaturalCompareTest::_RunTest(const char* a, const char* b, int expectedResult)
95 {
96 	int result = _Normalize(NaturalCompare(a, b));
97 
98 	char message[256];
99 	snprintf(message, sizeof(message), "\"%s\" vs. \"%s\" == %d, expected %d",
100 		a, b, result, expectedResult);
101 
102 	CppUnit::Asserter::failIf(result != expectedResult, message);
103 }
104 
105 
106 int
107 NaturalCompareTest::_Normalize(int result)
108 {
109 	if (result > 0)
110 		return 1;
111 	if (result < 0)
112 		return -1;
113 	return 0;
114 }
115