1 /*
2 SPDX-FileCopyrightText: 2007-2009 Sergio Pistone <sergio_pistone@yahoo.com.ar>
3 SPDX-FileCopyrightText: 2010-2018 Mladen Milinkovic <max@smoothware.net>
4
5 SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
8 #include "sstringtest.h"
9 #include "core/sstring.h"
10
11 #include <QTest> // krazy:exclude=c++/includes
12
13 #include <QDebug>
14
15 using namespace SubtitleComposer;
16
17 void
testStyleFlags()18 SStringTest::testStyleFlags()
19 {
20 SString sstring("0123456789");
21 sstring.setStyleFlagsAt(0, SString::Bold);
22 QVERIFY(sstring.styleFlagsAt(0) == SString::Bold);
23 QVERIFY(sstring.cummulativeStyleFlags() == SString::Bold);
24 QVERIFY(sstring.richString() == QLatin1String("<b>0</b>123456789"));
25 sstring.setStyleFlagsAt(2, SString::Italic);
26 QVERIFY(sstring.styleFlagsAt(2) == SString::Italic);
27 QVERIFY(sstring.cummulativeStyleFlags() == (SString::Bold | SString::Italic));
28 QVERIFY(sstring.richString() == QLatin1String("<b>0</b>1<i>2</i>3456789"));
29 sstring.setStyleFlagsAt(1, SString::Italic);
30 QVERIFY(sstring.styleFlagsAt(1) == SString::Italic);
31 QVERIFY(sstring.cummulativeStyleFlags() == (SString::Bold | SString::Italic));
32 QVERIFY(sstring.richString() == QLatin1String("<b>0</b><i>12</i>3456789"));
33 sstring.setStyleFlagsAt(0, SString::Italic);
34 QVERIFY(sstring.styleFlagsAt(0) == SString::Italic);
35 QVERIFY(sstring.cummulativeStyleFlags() == SString::Italic);
36 QVERIFY(sstring.richString() == QLatin1String("<i>012</i>3456789"));
37 sstring.setStyleFlagsAt(9, SString::Underline);
38 QVERIFY(sstring.styleFlagsAt(9) == SString::Underline);
39 QVERIFY(sstring.cummulativeStyleFlags() == (SString::Italic | SString::Underline));
40 QVERIFY(sstring.richString() == QLatin1String("<i>012</i>345678<u>9</u>"));
41
42 sstring.setStyleFlags(0, 15, 0);
43 QVERIFY(sstring.richString() == QLatin1String("0123456789"));
44 sstring.setStyleFlags(0, 3, SString::Bold);
45 QVERIFY(sstring.richString() == QLatin1String("<b>012</b>3456789"));
46 sstring.setStyleFlags(3, 3, SString::Italic);
47 QVERIFY(sstring.richString() == QLatin1String("<b>012</b><i>345</i>6789"));
48 sstring.setStyleFlags(6, 3, SString::Underline);
49 QVERIFY(sstring.richString() == QLatin1String("<b>012</b><i>345</i><u>678</u>9"));
50 sstring.setStyleFlags(9, 3, SString::StrikeThrough);
51 QVERIFY(sstring.richString() == QLatin1String("<b>012</b><i>345</i><u>678</u><s>9</s>"));
52
53 sstring.setStyleFlags(0, 15, SString::Bold | SString::Underline, false);
54 QVERIFY(sstring.richString() == QLatin1String("012<i>345</i>678<s>9</s>"));
55 sstring.setStyleFlags(0, 15, SString::StrikeThrough, true);
56 QVERIFY(sstring.richString() == QLatin1String("<s>012<i>345</i>6789</s>"));
57 sstring.setStyleFlags(4, 1, SString::Italic, false);
58 QVERIFY(sstring.richString() == QLatin1String("<s>012<i>3</i>4<i>5</i>6789</s>"));
59 }
60
61 void
testLeftMidRight()62 SStringTest::testLeftMidRight()
63 {
64 SString sstring;
65 sstring.setRichString("<b>012</b><i>345</i><u>678</u><s>9</s>");
66
67 QVERIFY(sstring.left(-1).richString() == QLatin1String("<b>012</b><i>345</i><u>678</u><s>9</s>"));
68 QVERIFY(sstring.left(-5).richString() == QLatin1String("<b>012</b><i>345</i><u>678</u><s>9</s>"));
69 QVERIFY(sstring.left(10).richString() == QLatin1String("<b>012</b><i>345</i><u>678</u><s>9</s>"));
70 QVERIFY(sstring.left(11).richString() == QLatin1String("<b>012</b><i>345</i><u>678</u><s>9</s>"));
71 QVERIFY(sstring.left(4).richString() == QLatin1String("<b>012</b><i>3</i>"));
72 QVERIFY(sstring.left(0).richString().isEmpty());
73
74 QVERIFY(sstring.mid(1, -1).richString() == QLatin1String("<b>12</b><i>345</i><u>678</u><s>9</s>"));
75 QVERIFY(sstring.mid(1, -5).richString() == QLatin1String("<b>12</b><i>345</i><u>678</u><s>9</s>"));
76 QVERIFY(sstring.mid(1, 10).richString() == QLatin1String("<b>12</b><i>345</i><u>678</u><s>9</s>"));
77 QVERIFY(sstring.mid(1, 11).richString() == QLatin1String("<b>12</b><i>345</i><u>678</u><s>9</s>"));
78 QVERIFY(sstring.mid(1, 4).richString() == QLatin1String("<b>12</b><i>34</i>"));
79 QVERIFY(sstring.mid(1, 0).richString().isEmpty());
80 QVERIFY(sstring.mid(10, 2).richString().isEmpty());
81 QVERIFY(sstring.mid(-2, 4).richString() == QLatin1String("<b>01</b>"));
82 QVERIFY(sstring.mid(-2, 11).richString() == QLatin1String("<b>012</b><i>345</i><u>678</u>"));
83 QVERIFY(sstring.mid(-2, -1).richString() == QLatin1String("<b>012</b><i>345</i><u>678</u><s>9</s>"));
84
85 QVERIFY(sstring.right(-1).richString() == QLatin1String("<b>012</b><i>345</i><u>678</u><s>9</s>"));
86 QVERIFY(sstring.right(-5).richString() == QLatin1String("<b>012</b><i>345</i><u>678</u><s>9</s>"));
87 QVERIFY(sstring.right(10).richString() == QLatin1String("<b>012</b><i>345</i><u>678</u><s>9</s>"));
88 QVERIFY(sstring.right(11).richString() == QLatin1String("<b>012</b><i>345</i><u>678</u><s>9</s>"));
89 QVERIFY(sstring.right(4).richString() == QLatin1String("<u>678</u><s>9</s>"));
90 QVERIFY(sstring.right(0).richString().isEmpty());
91 }
92
93 void
testInsert()94 SStringTest::testInsert()
95 {
96 SString sstring;
97
98 sstring.append(QString());
99 QVERIFY(sstring == SString());
100
101 sstring.append(SString("x", SString::Bold));
102 QVERIFY(sstring.richString() == QLatin1String("<b>x</b>"));
103 sstring.append(QStringLiteral("y"));
104 QVERIFY(sstring.richString() == QLatin1String("<b>xy</b>"));
105 sstring.append('z');
106 QVERIFY(sstring.richString() == QLatin1String("<b>xyz</b>"));
107
108 sstring.prepend(SString("c", SString::Italic));
109 QVERIFY(sstring.richString() == QLatin1String("<i>c</i><b>xyz</b>"));
110 sstring.prepend(QStringLiteral("b"));
111 QVERIFY(sstring.richString() == QLatin1String("<i>bc</i><b>xyz</b>"));
112 sstring.prepend('a');
113 QVERIFY(sstring.richString() == QLatin1String("<i>abc</i><b>xyz</b>"));
114
115 sstring.insert(3, SString("g", SString::Underline));
116 QVERIFY(sstring.richString() == QLatin1String("<i>abc</i><u>g</u><b>xyz</b>"));
117 sstring.insert(4, QStringLiteral("h"));
118 QVERIFY(sstring.richString() == QLatin1String("<i>abc</i><u>gh</u><b>xyz</b>"));
119 sstring.insert(5, 'i');
120 QVERIFY(sstring.richString() == QLatin1String("<i>abc</i><u>ghi</u><b>xyz</b>"));
121
122 sstring.clear();
123 QVERIFY(sstring == SString());
124 }
125
126 void
testReplace()127 SStringTest::testReplace()
128 {
129 SString sstring;
130
131 // SString& replace( int index, int len, const QString& replacement )
132 sstring = SString("0123456789");
133 sstring.replace(-1, 4, QStringLiteral("aaaa"));
134 QVERIFY(sstring == SString("0123456789"));
135 sstring.replace(-1, 0, QStringLiteral("bbbb"));
136 QVERIFY(sstring == SString("0123456789"));
137 sstring.replace(15, 0, QStringLiteral("cccc"));
138 QVERIFY(sstring == SString("0123456789"));
139 sstring.replace(15, 5, QStringLiteral("dddd"));
140 QVERIFY(sstring == SString("0123456789"));
141 sstring.replace(0, 2, QStringLiteral("eeee"));
142 QVERIFY(sstring == SString("eeee23456789"));
143 sstring.replace(5, -1, QStringLiteral("dddd"));
144 QVERIFY(sstring == SString("eeee2dddd"));
145
146 // SString& replace( int index, int len, const SString& replacement )
147 sstring = SString("0123456789");
148 sstring.replace(-1, 4, SString("aaaa"));
149 QVERIFY(sstring == SString("0123456789"));
150 sstring.replace(-1, 0, SString("bbbb"));
151 QVERIFY(sstring == SString("0123456789"));
152 sstring.replace(15, 0, SString("cccc"));
153 QVERIFY(sstring == SString("0123456789"));
154 sstring.replace(15, 5, SString("dddd"));
155 QVERIFY(sstring == SString("0123456789"));
156 sstring.replace(0, 2, SString("eeee"));
157 QVERIFY(sstring == SString("eeee23456789"));
158 sstring.replace(5, -1, SString("dddd"));
159 QVERIFY(sstring == SString("eeee2dddd"));
160
161 // SString& replace( const QString& before, const QString& after, Qt::CaseSensitivity cs=Qt::CaseSensitive )
162 sstring = SString("01234567890123456789");
163 sstring.replace(QStringLiteral("0"), QStringLiteral("A"), Qt::CaseSensitive);
164 QVERIFY(sstring == SString("A123456789A123456789"));
165 sstring.replace(QStringLiteral("23"), QStringLiteral("B"), Qt::CaseSensitive);
166 QVERIFY(sstring == SString("A1B456789A1B456789"));
167 sstring.replace(QStringLiteral("89"), QStringLiteral("C"), Qt::CaseSensitive);
168 QVERIFY(sstring == SString("A1B4567CA1B4567C"));
169 sstring.replace(QStringLiteral("67CA1B"), QStringLiteral("D"), Qt::CaseSensitive);
170 QVERIFY(sstring == SString("A1B45D4567C"));
171 sstring.replace(QString(), QStringLiteral("E"), Qt::CaseSensitive);
172 QVERIFY(sstring == SString("EAE1EBE4E5EDE4E5E6E7ECE"));
173 sstring = SString("3");
174 sstring.replace(QString(), QStringLiteral("AA"), Qt::CaseSensitive);
175 QVERIFY(sstring == SString("AA3AA"));
176 sstring = SString();
177 sstring.replace(QString(), QStringLiteral("AA"), Qt::CaseSensitive);
178 QVERIFY(sstring == SString("AA"));
179
180 // SString& replace( const QString& before, const SString& after, Qt::CaseSensitivity cs=Qt::CaseSensitive )
181 sstring = SString("01234567890123456789");
182 sstring.replace(QStringLiteral("0"), SString("A", SString::Bold), Qt::CaseSensitive);
183 QVERIFY(sstring.richString() == QLatin1String("<b>A</b>123456789<b>A</b>123456789"));
184 sstring.replace(QStringLiteral("23"), SString("B", SString::Italic), Qt::CaseSensitive);
185 QVERIFY(sstring.richString() == QLatin1String("<b>A</b>1<i>B</i>456789<b>A</b>1<i>B</i>456789"));
186 sstring.replace(QStringLiteral("89"), SString("C", SString::Underline), Qt::CaseSensitive);
187 QVERIFY(sstring.richString() == QLatin1String("<b>A</b>1<i>B</i>4567<u>C</u><b>A</b>1<i>B</i>4567<u>C</u>"));
188 sstring.replace(QStringLiteral("67CA1B"), SString("D", SString::StrikeThrough), Qt::CaseSensitive);
189 QVERIFY(sstring.richString() == QLatin1String("<b>A</b>1<i>B</i>45<s>D</s>4567<u>C</u>"));
190 sstring.replace(QString(), SString("E"), Qt::CaseSensitive);
191 QVERIFY(sstring.richString() == QLatin1String("E<b>A</b>E1E<i>B</i>E4E5E<s>D</s>E4E5E6E7E<u>C</u>E"));
192 sstring = SString("3");
193 sstring.replace(QString(), SString("AA", SString::Bold), Qt::CaseSensitive);
194 QVERIFY(sstring.richString() == QLatin1String("<b>AA</b>3<b>AA</b>"));
195 sstring = SString();
196 sstring.replace(QString(), SString("AA", SString::Italic), Qt::CaseSensitive);
197 QVERIFY(sstring.richString() == QLatin1String("<i>AA</i>"));
198
199 // SString& replace( const QRegExp& rx, const QString& after )
200 sstring = SString("this is a pretty test");
201 sstring.replace(QRegExp("^this"), "\\2\\0");
202 QVERIFY(sstring.richString() == QLatin1String("\\2this is a pretty test"));
203 sstring.replace(QRegExp("[\\w]+"), "w");
204 QVERIFY(sstring.richString() == QLatin1String("\\w w w w w"));
205 sstring = SString("this is a pretty test");
206 sstring.replace(QRegExp("([\\w]*)"), "[\\1]");
207 QVERIFY(sstring.richString() == QLatin1String("[this][] [is][] [a][] [pretty][] [test][]"));
208
209 // SString& SString::replace( QChar before, QChar after, Qt::CaseSensitivity cs=Qt::CaseSensitive )
210 sstring.setRichString("<b>This </b>Is <i>a preTtI</i> testi");
211 sstring.replace('I', 'X', Qt::CaseSensitive);
212 QVERIFY(sstring.richString() == QLatin1String("<b>This </b>Xs <i>a preTtX</i> testi"));
213 sstring.replace('T', 'w', Qt::CaseInsensitive);
214 QVERIFY(sstring.richString() == QLatin1String("<b>whis </b>Xs <i>a prewwX</i> weswi"));
215
216 // SString& SString::replace( QChar ch, const QString& after, Qt::CaseSensitivity cs=Qt::CaseSensitive )
217 sstring.setRichString("<b>This </b>Is <i>a preTtI</i> testi");
218 sstring.replace('i', QStringLiteral("AA"), Qt::CaseInsensitive);
219 QVERIFY(sstring.richString() == QLatin1String("<b>ThAAs </b>AAs <i>a preTtAA</i> testAA"));
220 sstring.replace('T', QStringLiteral("XX"), Qt::CaseSensitive);
221 QVERIFY(sstring.richString() == QLatin1String("<b>XXhAAs </b>AAs <i>a preXXtAA</i> testAA"));
222
223 // SString& SString::replace( QChar ch, const SString& after, Qt::CaseSensitivity cs=Qt::CaseSensitive )
224 sstring.setRichString("<b>This </b>Is <i>a preTtI</i> testi");
225 sstring.replace('i', SString("A", SString::Bold));
226 QVERIFY(sstring.richString() == QLatin1String("<b>ThAs </b>Is <i>a preTtI</i> test<b>A</b>"));
227 sstring.replace('T', SString("X", SString::Underline), Qt::CaseInsensitive);
228 QVERIFY(sstring == SString().setRichString("<u>X</u><b>hAs </b>Is <i>a pre</i><u>XX</u><i>I</i> <u>X</u>es<u>X</u><b>A</b>"));
229
230 // SString& remove( int index, int len );
231 sstring.setRichString("<b>012</b><i>345</i><u>678</u><s>9</s>");
232 sstring.remove(0, 0);
233 QVERIFY(sstring.richString() == QLatin1String("<b>012</b><i>345</i><u>678</u><s>9</s>"));
234 sstring.remove(0, 2);
235 QVERIFY(sstring.richString() == QLatin1String("<b>2</b><i>345</i><u>678</u><s>9</s>"));
236 sstring.remove(10, 2);
237 QVERIFY(sstring.richString() == QLatin1String("<b>2</b><i>345</i><u>678</u><s>9</s>"));
238 sstring.remove(8, 5);
239 QVERIFY(sstring.richString() == QLatin1String("<b>2</b><i>345</i><u>678</u><s>9</s>"));
240 sstring.remove(7, 3);
241 QVERIFY(sstring.richString() == QLatin1String("<b>2</b><i>345</i><u>678</u>"));
242 sstring.remove(0, 3);
243 QVERIFY(sstring.richString() == QLatin1String("<i>5</i><u>678</u>"));
244 sstring.remove(0, -1);
245 QVERIFY(sstring.richString().isEmpty());
246
247 // SString& remove( const QString& str, Qt::CaseSensitivity cs=Qt::CaseSensitive );
248 sstring.setRichString("<b>012</b><i>012</i><u>345</u><s>345</s>");
249 sstring.remove("013");
250 QVERIFY(sstring.richString() == QLatin1String("<b>012</b><i>012</i><u>345</u><s>345</s>"));
251 sstring.remove("01");
252 QVERIFY(sstring.richString() == QLatin1String("<b>2</b><i>2</i><u>345</u><s>345</s>"));
253 sstring.remove("2345");
254 QVERIFY(sstring.richString() == QLatin1String("<b>2</b><s>345</s>"));
255
256 // SString& remove( const QRegExp& rx );
257 sstring.setRichString("<b>012</b><i>012</i><u>345</u><s>345</s>");
258 sstring.remove(QRegExp("^013"));
259 QVERIFY(sstring.richString() == QLatin1String("<b>012</b><i>012</i><u>345</u><s>345</s>"));
260 sstring.remove(QRegExp("^012"));
261 QVERIFY(sstring.richString() == QLatin1String("<i>012</i><u>345</u><s>345</s>"));
262 sstring.remove(QRegExp("345$"));
263 QVERIFY(sstring.richString() == QLatin1String("<i>012</i><u>345</u>"));
264 sstring.remove(QRegExp("\\d+"));
265 QVERIFY(sstring.richString().isEmpty());
266
267 // SString& remove( QChar ch, Qt::CaseSensitivity cs=Qt::CaseSensitive );
268 sstring.setRichString("<b>This </b>Is <i>a preTtI</i> testi");
269 sstring.remove(QChar('T'), Qt::CaseSensitive);
270 QVERIFY(sstring.richString() == QLatin1String("<b>his </b>Is <i>a pretI</i> testi"));
271 sstring.remove(QChar('i'), Qt::CaseInsensitive);
272 QVERIFY(sstring.richString() == QLatin1String("<b>hs </b>s <i>a pret</i> test"));
273
274 sstring.setRichString("<b>a</b>");
275 sstring.replace(QRegExp("a$"), "b");
276 QVERIFY(sstring.richString() == QLatin1String("<b>b</b>"));
277
278 sstring.setRichString("c<b>a</b>c");
279 sstring.replace("c", "b"); // krazy:exclude=c++/doublequote_chars
280 QVERIFY(sstring.richString() == QLatin1String("b<b>a</b>b"));
281
282 sstring.setRichString("c<b>a</b>c");
283 sstring.replace('c', 'b');
284 QVERIFY(sstring.richString() == QLatin1String("b<b>a</b>b"));
285 }
286
287 QTEST_GUILESS_MAIN(SStringTest);
288