1 #include "common/common_pch.h"
2
3 #include "common/strings/editing.h"
4
5 #include "tests/unit/init.h"
6
7 namespace {
8
TEST(StringsEditing,NormalizeLineEndings)9 TEST(StringsEditing, NormalizeLineEndings) {
10 EXPECT_EQ("this\nis\n\na kind\n\nof\nmagic", mtx::string::normalize_line_endings("this\ris\r\ra kind\r\n\r\nof\nmagic"));
11 EXPECT_EQ("this\nis\n\na kind\n\nof\nmagic", mtx::string::normalize_line_endings("this\ris\r\ra kind\r\n\r\nof\nmagic", mtx::string::line_ending_style_e::lf));
12 EXPECT_EQ("this\r\nis\r\n\r\na kind\r\n\r\nof\r\nmagic", mtx::string::normalize_line_endings("this\ris\r\ra kind\r\n\r\nof\nmagic", mtx::string::line_ending_style_e::cr_lf));
13 EXPECT_EQ("", mtx::string::normalize_line_endings("", mtx::string::line_ending_style_e::lf));
14 EXPECT_EQ("", mtx::string::normalize_line_endings("", mtx::string::line_ending_style_e::cr_lf));
15 }
16
TEST(StringsEditing,Chomp)17 TEST(StringsEditing, Chomp) {
18 EXPECT_EQ("this\ris\r\ra kind\r\n\r\nof\nmagic", mtx::string::chomp("this\ris\r\ra kind\r\n\r\nof\nmagic\r\n\r\n"));
19 EXPECT_EQ("this\ris\r\ra kind\r\n\r\nof\nmagic", mtx::string::chomp("this\ris\r\ra kind\r\n\r\nof\nmagic\n\n"));
20 EXPECT_EQ("this\ris\r\ra kind\r\n\r\nof\nmagic", mtx::string::chomp("this\ris\r\ra kind\r\n\r\nof\nmagic\r\r"));
21 EXPECT_EQ("this\ris\r\ra kind\r\n\r\nof\nmagic ", mtx::string::chomp("this\ris\r\ra kind\r\n\r\nof\nmagic "));
22 }
23
TEST(StringsEditing,SplittingByStringEmptyPattern)24 TEST(StringsEditing, SplittingByStringEmptyPattern) {
25 auto r = mtx::string::split("This, and that, is stuff."s, ""s);
26
27 ASSERT_EQ(1, r.size());
28 EXPECT_EQ("This, and that, is stuff."s, r[0]);
29 }
30
TEST(StringsEditing,SplittingByStringEmptyText)31 TEST(StringsEditing, SplittingByStringEmptyText) {
32 auto r = mtx::string::split(""s, ","s);
33
34 ASSERT_EQ(1, r.size());
35 EXPECT_EQ(""s, r[0]);
36 }
37
TEST(StringsEditing,SplittingByStringOneCharPattern)38 TEST(StringsEditing, SplittingByStringOneCharPattern) {
39 auto r = mtx::string::split("This, and that, is stuff."s, ","s);
40
41 ASSERT_EQ(3, r.size());
42 EXPECT_EQ("This"s, r[0]);
43 EXPECT_EQ(" and that"s, r[1]);
44 EXPECT_EQ(" is stuff."s, r[2]);
45 }
46
TEST(StringsEditing,SplittingByStringTwoCharsPattern)47 TEST(StringsEditing, SplittingByStringTwoCharsPattern) {
48 auto r = mtx::string::split("This, and that, is stuff."s, ", "s);
49
50 ASSERT_EQ(3, r.size());
51 EXPECT_EQ("This"s, r[0]);
52 EXPECT_EQ("and that"s, r[1]);
53 EXPECT_EQ("is stuff."s, r[2]);
54 }
55
TEST(StringsEditing,SplittingByStringLimit2)56 TEST(StringsEditing, SplittingByStringLimit2) {
57 auto r = mtx::string::split("This, and that, is stuff."s, ", "s, 2);
58
59 ASSERT_EQ(2, r.size());
60 EXPECT_EQ("This"s, r[0]);
61 EXPECT_EQ("and that, is stuff."s, r[1]);
62 }
63
TEST(StringsEditing,SplittingByStringLimit1)64 TEST(StringsEditing, SplittingByStringLimit1) {
65 auto r = mtx::string::split("This, and that, is stuff."s, ", "s, 1);
66
67 ASSERT_EQ(1, r.size());
68 EXPECT_EQ("This, and that, is stuff."s, r[0]);
69 }
70
TEST(StringsEditing,SplittingByStringPatternAtStart)71 TEST(StringsEditing, SplittingByStringPatternAtStart) {
72 auto r = mtx::string::split(",This, and that, is stuff."s, ","s);
73
74 ASSERT_EQ(4, r.size());
75 EXPECT_EQ(""s, r[0]);
76 EXPECT_EQ("This"s, r[1]);
77 EXPECT_EQ(" and that"s, r[2]);
78 EXPECT_EQ(" is stuff."s, r[3]);
79 }
80
TEST(StringsEditing,SplittingByStringPatternAtEnd)81 TEST(StringsEditing, SplittingByStringPatternAtEnd) {
82 auto r = mtx::string::split("This, and that, is stuff.,"s, ","s);
83
84 ASSERT_EQ(4, r.size());
85 EXPECT_EQ("This"s, r[0]);
86 EXPECT_EQ(" and that"s, r[1]);
87 EXPECT_EQ(" is stuff."s, r[2]);
88 EXPECT_EQ(""s, r[3]);
89 }
90
TEST(StringsEditing,SplittingRegexByStringEmptyPattern)91 TEST(StringsEditing, SplittingRegexByStringEmptyPattern) {
92 auto r = mtx::string::split("This, and that, is stuff."s, QRegularExpression{""});
93
94 ASSERT_EQ(27, r.size());
95 EXPECT_EQ("", r[0]);
96 EXPECT_EQ("T", r[1]);
97 EXPECT_EQ("h", r[2]);
98 EXPECT_EQ("i", r[3]);
99 EXPECT_EQ("s", r[4]);
100 EXPECT_EQ(",", r[5]);
101 EXPECT_EQ(" ", r[6]);
102 EXPECT_EQ("a", r[7]);
103 EXPECT_EQ("n", r[8]);
104 EXPECT_EQ("d", r[9]);
105 EXPECT_EQ(" ", r[10]);
106 EXPECT_EQ("t", r[11]);
107 EXPECT_EQ("h", r[12]);
108 EXPECT_EQ("a", r[13]);
109 EXPECT_EQ("t", r[14]);
110 EXPECT_EQ(",", r[15]);
111 EXPECT_EQ(" ", r[16]);
112 EXPECT_EQ("i", r[17]);
113 EXPECT_EQ("s", r[18]);
114 EXPECT_EQ(" ", r[19]);
115 EXPECT_EQ("s", r[20]);
116 EXPECT_EQ("t", r[21]);
117 EXPECT_EQ("u", r[22]);
118 EXPECT_EQ("f", r[23]);
119 EXPECT_EQ("f", r[24]);
120 EXPECT_EQ(".", r[25]);
121 EXPECT_EQ("", r[26]);
122 }
123
TEST(StringsEditing,SplittingRegexByStringEmptyText)124 TEST(StringsEditing, SplittingRegexByStringEmptyText) {
125 auto r = mtx::string::split(""s, QRegularExpression{","});
126
127 ASSERT_EQ(1, r.size());
128 EXPECT_EQ(""s, r[0]);
129 }
130
TEST(StringsEditing,SplittingRegexByStringOneCharPattern)131 TEST(StringsEditing, SplittingRegexByStringOneCharPattern) {
132 auto r = mtx::string::split("This, and that, is stuff."s, QRegularExpression{","});
133
134 ASSERT_EQ(3, r.size());
135 EXPECT_EQ("This"s, r[0]);
136 EXPECT_EQ(" and that"s, r[1]);
137 EXPECT_EQ(" is stuff."s, r[2]);
138 }
139
TEST(StringsEditing,SplittingRegexByStringTwoCharsPattern)140 TEST(StringsEditing, SplittingRegexByStringTwoCharsPattern) {
141 auto r = mtx::string::split("This, and that, is stuff."s, QRegularExpression{", *"});
142
143 ASSERT_EQ(3, r.size());
144 EXPECT_EQ("This"s, r[0]);
145 EXPECT_EQ("and that"s, r[1]);
146 EXPECT_EQ("is stuff."s, r[2]);
147 }
148
TEST(StringsEditing,SplittingRegexByStringLimit2)149 TEST(StringsEditing, SplittingRegexByStringLimit2) {
150 auto r = mtx::string::split("This, and that, is stuff."s, QRegularExpression{", *"}, 2);
151
152 ASSERT_EQ(2, r.size());
153 EXPECT_EQ("This"s, r[0]);
154 EXPECT_EQ("and that, is stuff."s, r[1]);
155 }
156
TEST(StringsEditing,SplittingRegexByStringLimit1)157 TEST(StringsEditing, SplittingRegexByStringLimit1) {
158 auto r = mtx::string::split("This, and that, is stuff."s, QRegularExpression{", *"}, 1);
159
160 ASSERT_EQ(1, r.size());
161 EXPECT_EQ("This, and that, is stuff."s, r[0]);
162 }
163
TEST(StringsEditing,SplittingRegexByStringPatternAtStart)164 TEST(StringsEditing, SplittingRegexByStringPatternAtStart) {
165 auto r = mtx::string::split(",This, and that, is stuff."s, QRegularExpression{", *"});
166
167 ASSERT_EQ(4, r.size());
168 EXPECT_EQ(""s, r[0]);
169 EXPECT_EQ("This"s, r[1]);
170 EXPECT_EQ("and that"s, r[2]);
171 EXPECT_EQ("is stuff."s, r[3]);
172 }
173
TEST(StringsEditing,SplittingRegexByStringPatternAtEnd)174 TEST(StringsEditing, SplittingRegexByStringPatternAtEnd) {
175 auto r = mtx::string::split("This, and that, is stuff.,"s, QRegularExpression{", *"});
176
177 ASSERT_EQ(4, r.size());
178 EXPECT_EQ("This"s, r[0]);
179 EXPECT_EQ("and that"s, r[1]);
180 EXPECT_EQ("is stuff."s, r[2]);
181 EXPECT_EQ(""s, r[3]);
182 }
183
TEST(StringsEditing,ReplacingRegex)184 TEST(StringsEditing, ReplacingRegex) {
185 QRegularExpression re{"\\.0*$|(\\.[0-9]*[1-9])0*$"};
186 auto repl = [](QRegularExpressionMatch const &match) {
187 return match.captured(1);
188 };
189
190 EXPECT_EQ("48000", mtx::string::replace("48000.", re, repl));
191 EXPECT_EQ("48000", mtx::string::replace("48000.0", re, repl));
192 EXPECT_EQ("48000", mtx::string::replace("48000.000", re, repl));
193 EXPECT_EQ("48000.0012", mtx::string::replace("48000.0012", re, repl));
194 EXPECT_EQ("48000.0012", mtx::string::replace("48000.001200", re, repl));
195 EXPECT_EQ("48000.00120034", mtx::string::replace("48000.00120034", re, repl));
196 EXPECT_EQ("48000.00120034", mtx::string::replace("48000.0012003400", re, repl));
197 }
198
199 }
200