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