Celestia

Форк
0
/
strnatcmp_test.cpp 
129 строк · 3.6 Кб
1
#include <string_view>
2
#include <tuple>
3

4
#include <doctest.h>
5

6
#include <celutil/strnatcmp.h>
7

8
using namespace std::string_view_literals;
9

10

11
bool comparesSame(int a, int b)
12
{
13
    return ((a < 0) == (b < 0)) && ((a > 0) == (b > 0));
14
}
15

16

17
TEST_SUITE_BEGIN("Natural string comparison");
18

19
TEST_CASE("No numbers")
20
{
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 },
31
    };
32

33
    for (const auto& [first, second, result] : examples)
34
    {
35
        REQUIRE(comparesSame(strnatcmp(first, second), result));
36
    }
37
}
38

39
TEST_CASE("With numbers")
40
{
41
    std::tuple<std::string_view, std::string_view, int> examples[] = {
42
        { "123", "123", 0 },
43
        { "1.23", "1.23", 0},
44
        { "12", "123", -1 },
45
        { "89", "123", -1 },
46
        { "123", "12", 1 },
47
        { "123", "89", 1 },
48
        { "1.05", "1.2", -1 },
49
        { "1.2", "1.05", 1 },
50
        { "z123", "z123", 0 },
51
        { "z1.23", "z1.23", 0},
52
        { "z12", "z123", -1 },
53
        { "z89", "z123", -1 },
54
        { "z123", "z12", 1 },
55
        { "z123", "z89", 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 },
62
        { "123z", "12z", 1 },
63
        { "123z", "89z", 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 },
92
    };
93

94
    for (const auto& [first, second, result] : examples)
95
    {
96
        REQUIRE(comparesSame(strnatcmp(first, second), result));
97
    }
98
}
99

100
TEST_CASE("Skip leading space")
101
{
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 },
121
    };
122

123
    for (const auto& [first, second, result] : examples)
124
    {
125
        REQUIRE(comparesSame(strnatcmp(first, second), result));
126
    }
127
}
128

129
TEST_SUITE_END();
130

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.