6
#include <celutil/strnatcmp.h>
8
using namespace std::string_view_literals;
11
bool comparesSame(int a, int b)
13
return ((a < 0) == (b < 0)) && ((a > 0) == (b > 0));
17
TEST_SUITE_BEGIN("Natural string comparison");
19
TEST_CASE("No numbers")
21
std::tuple<std::string_view, std::string_view, int> examples[] = {
22
{ "abc"sv, "abc"sv, 0 },
23
{ "de"sv, "def"sv, -1 },
24
{ "ghi"sv, "gh"sv, 1 },
25
{ "abc"sv, "def"sv, -1 },
26
{ "ab"sv, "def"sv, -1 },
27
{ "abc"sv, "de"sv, -1 },
28
{ "jkl"sv, "ghi"sv, 1 },
29
{ "jk"sv, "ghi"sv, 1 },
30
{ "jkl"sv, "gh"sv, 1 },
33
for (const auto& [first, second, result] : examples)
35
REQUIRE(comparesSame(strnatcmp(first, second), result));
39
TEST_CASE("With numbers")
41
std::tuple<std::string_view, std::string_view, int> examples[] = {
48
{ "1.05", "1.2", -1 },
50
{ "z123", "z123", 0 },
51
{ "z1.23", "z1.23", 0},
52
{ "z12", "z123", -1 },
53
{ "z89", "z123", -1 },
56
{ "z1.05", "z1.2", -1 },
57
{ "z1.2", "z1.05", 1 },
58
{ "123z", "123z", 0 },
59
{ "1.23z", "1.23z", 0},
60
{ "12z", "123z", -1 },
61
{ "89z", "123z", -1 },
64
{ "1.05z", "1.2z", -1 },
65
{ "1.2z", "1.05z", 1 },
66
{ "x123z", "x123z", 0 },
67
{ "x1.23z", "x1.23z", 0},
68
{ "x12z", "x123z", -1 },
69
{ "x89z", "x123z", -1 },
70
{ "x123z", "x12z", 1 },
71
{ "x123z", "x89z", 1 },
72
{ "x1.05z", "x1.2z", -1 },
73
{ "x1.2z", "x1.05z", 1 },
74
{ "987abc"sv, "987abc"sv, 0 },
75
{ "987de"sv, "987def"sv, -1 },
76
{ "987ghi"sv, "987gh"sv, 1 },
77
{ "987abc"sv, "987def"sv, -1 },
78
{ "987ab"sv, "987def"sv, -1 },
79
{ "987abc"sv, "987de"sv, -1 },
80
{ "987jkl"sv, "987ghi"sv, 1 },
81
{ "987jk"sv, "987ghi"sv, 1 },
82
{ "987jkl"sv, "987gh"sv, 1 },
83
{ "abc987"sv, "abc987"sv, 0 },
84
{ "de987"sv, "def987"sv, -1 },
85
{ "ghi987"sv, "gh987"sv, 1 },
86
{ "abc987"sv, "def987"sv, -1 },
87
{ "ab987"sv, "def987"sv, -1 },
88
{ "abc987"sv, "de987"sv, -1 },
89
{ "jkl987"sv, "ghi987"sv, 1 },
90
{ "jk987"sv, "ghi987"sv, 1 },
91
{ "jkl987"sv, "gh987"sv, 1 },
94
for (const auto& [first, second, result] : examples)
96
REQUIRE(comparesSame(strnatcmp(first, second), result));
100
TEST_CASE("Skip leading space")
102
std::tuple<std::string_view, std::string_view, int> examples[] = {
103
{ " abc"sv, "abc"sv, 0 },
104
{ " de"sv, "def"sv, -1 },
105
{ " ghi"sv, "gh"sv, 1 },
106
{ " abc"sv, "def"sv, -1 },
107
{ " ab"sv, "def"sv, -1 },
108
{ " abc"sv, "de"sv, -1 },
109
{ " jkl"sv, "ghi"sv, 1 },
110
{ " jk"sv, "ghi"sv, 1 },
111
{ " jkl"sv, "gh"sv, 1 },
112
{ "abc"sv, " abc"sv, 0 },
113
{ "de"sv, " def"sv, -1 },
114
{ "ghi"sv, " gh"sv, 1 },
115
{ "abc"sv, " def"sv, -1 },
116
{ "ab"sv, " def"sv, -1 },
117
{ "abc"sv, " de"sv, -1 },
118
{ "jkl"sv, " ghi"sv, 1 },
119
{ "jk"sv, " ghi"sv, 1 },
120
{ "jkl"sv, " gh"sv, 1 },
123
for (const auto& [first, second, result] : examples)
125
REQUIRE(comparesSame(strnatcmp(first, second), result));