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