‪TYPO3CMS  ‪main
HtmlCropperTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use PHPUnit\Framework\Attributes\DataProvider;
21 use PHPUnit\Framework\Attributes\Test;
23 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
24 
25 final class ‪HtmlCropperTest extends UnitTestCase
26 {
28 
29  protected function ‪setUp(): void
30  {
31  parent::setUp();
32  $this->subject = new ‪HtmlCropper();
33  }
34 
35  #[Test]
36  public function ‪cropIsMultibyteSafe(): void
37  {
38  $actual = $this->subject->crop(
39  content: 'бла',
40  numberOfChars: 3,
41  replacementForEllipsis: '...',
42  cropToSpace: false
43  );
44  self::assertEquals('бла', $actual);
45  }
46 
47  public static function ‪cropWorksDataProvicer(): \Generator
48  {
49  $plainText = 'Kasper Sk' . chr(229) . 'rh' . chr(248)
50  . 'j implemented the original version of the crop function.';
51  $textWithMarkup = '<strong><a href="mailto:kasper@typo3.org">Kasper Sk'
52  . chr(229) . 'rh' . chr(248) . 'j</a> implemented</strong> the '
53  . 'original version of the crop function.';
54  $textWithEntities = 'Kasper Sk&aring;rh&oslash;j implemented the; '
55  . 'original version of the crop function.';
56  $textWithLinebreaks = "Lorem ipsum dolor sit amet,\n"
57  . "consetetur sadipscing elitr,\n"
58  . 'sed diam nonumy eirmod tempor invidunt ut labore e'
59  . 't dolore magna aliquyam';
60  $textWith2000Chars = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ips &amp;. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, quis gravida magna mi a libero. Fusce vulputate eleifend sapien. Vestibulum purus quam, scelerisque ut, mollis sed, nonummy id, metus. Nullam accumsan lorem in dui. Cras ultricies mi eu turpis hendrerit fringilla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In ac dui quis mi consectetuer lacinia. Nam pretium turpis et arcu. Duis arcu tortor, suscipit eget, imperdiet nec, imperdiet iaculis, ipsum. Sed aliquam ultrices mauris. Integer ante arcu, accumsan a, consectetuer eget, posuere ut, mauris. Praesent adipiscing. Phasellus ullamcorper ipsum rutrum nunc. Nunc nonummy metus. Vesti&amp;';
61  $textWith1000AmpHtmlEntity = str_repeat('&amp;', 1000);
62  $textWith2000AmpHtmlEntity = str_repeat('&amp;', 2000);
63 
64  // plain text
65  yield 'plain text; 11|...|0' => [
66  'expected' => 'Kasper Sk' . chr(229) . 'r...',
67  'content' => $plainText,
68  'numberOfChars' => 11,
69  'replacementForEllipsis' => '...',
70  'cropToSpace' => false,
71  ];
72 
73  yield 'plain text; -58|...|0' => [
74  'expected' => '...h' . chr(248) . 'j implemented the original version of the crop function.',
75  'content' => $plainText,
76  'numberOfChars' => -58,
77  'replacementForEllipsis' => '...',
78  'cropToSpace' => false,
79  ];
80 
81  yield 'plain text; 4|...|1' => [
82  'expected' => 'Kasp...',
83  'content' => $plainText,
84  'numberOfChars' => 4,
85  'replacementForEllipsis' => '...',
86  'cropToSpace' => true,
87  ];
88 
89  yield 'plain text; 20|...|1' => [
90  'expected' => 'Kasper Sk' . chr(229) . 'rh' . chr(248) . 'j...',
91  'content' => $plainText,
92  'numberOfChars' => 20,
93  'replacementForEllipsis' => '...',
94  'cropToSpace' => true,
95  ];
96 
97  yield 'plain text; -5|...|1' => [
98  'expected' => '...tion.',
99  'content' => $plainText,
100  'numberOfChars' => -5,
101  'replacementForEllipsis' => '...',
102  'cropToSpace' => true,
103  ];
104 
105  yield 'plain text; -49|...|1' => [
106  'expected' => '...the original version of the crop function.',
107  'content' => $plainText,
108  'numberOfChars' => -49,
109  'replacementForEllipsis' => '...',
110  'cropToSpace' => true,
111  ];
112 
113  // with markup (html)
114  yield 'text with markup; 11|...|0' => [
115  'expected' => '<strong><a href="mailto:kasper@typo3.org">Kasper Sk'
116  . chr(229) . 'r...</a></strong>',
117  'content' => $textWithMarkup,
118  'numberOfChars' => 11,
119  'replacementForEllipsis' => '...',
120  'cropToSpace' => false,
121  ];
122 
123  yield 'text with markup; 13|...|0' => [
124  'expected' => '<strong><a href="mailto:kasper@typo3.org">Kasper Sk'
125  . chr(229) . 'rh' . chr(248) . '...</a></strong>',
126  'content' => $textWithMarkup,
127  'numberOfChars' => 13,
128  'replacementForEllipsis' => '...',
129  'cropToSpace' => false,
130  ];
131 
132  yield 'text with markup; 14|...|0' => [
133  'expected' => '<strong><a href="mailto:kasper@typo3.org">Kasper Sk'
134  . chr(229) . 'rh' . chr(248) . 'j</a>...</strong>',
135  'content' => $textWithMarkup,
136  'numberOfChars' => 14,
137  'replacementForEllipsis' => '...',
138  'cropToSpace' => false,
139  ];
140 
141  yield 'text with markup; 15|...|0' => [
142  'expected' => '<strong><a href="mailto:kasper@typo3.org">Kasper Sk'
143  . chr(229) . 'rh' . chr(248) . 'j</a> ...</strong>',
144  'content' => $textWithMarkup,
145  'numberOfChars' => 15,
146  'replacementForEllipsis' => '...',
147  'cropToSpace' => false,
148  ];
149 
150  yield 'text with markup; 29|...|0' => [
151  'expected' => '<strong><a href="mailto:kasper@typo3.org">Kasper Sk'
152  . chr(229) . 'rh' . chr(248) . 'j</a> implemented</strong> th...',
153  'content' => $textWithMarkup,
154  'numberOfChars' => 29,
155  'replacementForEllipsis' => '...',
156  'cropToSpace' => false,
157  ];
158 
159  yield 'text with markup; -58|...|0' => [
160  'expected' => '<strong><a href="mailto:kasper@typo3.org">...h' . chr(248)
161  . 'j</a> implemented</strong> the original version of the crop function.',
162  'content' => $textWithMarkup,
163  'numberOfChars' => -58,
164  'replacementForEllipsis' => '...',
165  'cropToSpace' => false,
166  ];
167 
168  yield 'text with markup 4|...|1' => [
169  'expected' => '<strong><a href="mailto:kasper@typo3.org">Kasp...</a></strong>',
170  'content' => $textWithMarkup,
171  'numberOfChars' => 4,
172  'replacementForEllipsis' => '...',
173  'cropToSpace' => true,
174  ];
175 
176  yield 'text with markup; 11|...|1' => [
177  'expected' => '<strong><a href="mailto:kasper@typo3.org">Kasper...</a></strong>',
178  'content' => $textWithMarkup,
179  'numberOfChars' => 11,
180  'replacementForEllipsis' => '...',
181  'cropToSpace' => true,
182  ];
183 
184  yield 'text with markup; 13|...|1' => [
185  'expected' => '<strong><a href="mailto:kasper@typo3.org">Kasper...</a></strong>',
186  'content' => $textWithMarkup,
187  'numberOfChars' => 13,
188  'replacementForEllipsis' => '...',
189  'cropToSpace' => true,
190  ];
191 
192  yield 'text with markup; 14|...|1' => [
193  'expected' => '<strong><a href="mailto:kasper@typo3.org">Kasper Sk'
194  . chr(229) . 'rh' . chr(248) . 'j</a>...</strong>',
195  'content' => $textWithMarkup,
196  'numberOfChars' => 14,
197  'replacementForEllipsis' => '...',
198  'cropToSpace' => true,
199  ];
200 
201  yield 'text with markup; 15|...|1' => [
202  'expected' => '<strong><a href="mailto:kasper@typo3.org">Kasper Sk'
203  . chr(229) . 'rh' . chr(248) . 'j</a>...</strong>',
204  'content' => $textWithMarkup,
205  'numberOfChars' => 15,
206  'replacementForEllipsis' => '...',
207  'cropToSpace' => true,
208  ];
209 
210  yield 'text with markup; 29|...|1' => [
211  'expected' => '<strong><a href="mailto:kasper@typo3.org">Kasper Sk'
212  . chr(229) . 'rh' . chr(248) . 'j</a> implemented</strong>...',
213  'content' => $textWithMarkup,
214  'numberOfChars' => 29,
215  'replacementForEllipsis' => '...',
216  'cropToSpace' => true,
217  ];
218 
219  yield 'text with markup; -66|...|1' => [
220  'expected' => '<strong><a href="mailto:kasper@typo3.org">...Sk' . chr(229)
221  . 'rh' . chr(248) . 'j</a> implemented</strong> the original v'
222  . 'ersion of the crop function.',
223  'content' => $textWithMarkup,
224  'numberOfChars' => -66,
225  'replacementForEllipsis' => '...',
226  'cropToSpace' => true,
227  ];
228 
229  // text with ententies (html)
230  yield 'text with entities 9|...|0' => [
231  'expected' => 'Kasper Sk...',
232  'content' => $textWithEntities,
233  'numberOfChars' => 9,
234  'replacementForEllipsis' => '...',
235  'cropToSpace' => false,
236  ];
237 
238  yield 'text with entities 10|...|0' => [
239  'expected' => 'Kasper Sk&aring;...',
240  'content' => $textWithEntities,
241  'numberOfChars' => 10,
242  'replacementForEllipsis' => '...',
243  'cropToSpace' => false,
244  ];
245 
246  yield 'text with entities 11|...|0' => [
247  'expected' => 'Kasper Sk&aring;r...',
248  'content' => $textWithEntities,
249  'numberOfChars' => 11,
250  'replacementForEllipsis' => '...',
251  'cropToSpace' => false,
252  ];
253 
254  yield 'text with entities 13|...|0' => [
255  'expected' => 'Kasper Sk&aring;rh&oslash;...',
256  'content' => $textWithEntities,
257  'numberOfChars' => 13,
258  'replacementForEllipsis' => '...',
259  'cropToSpace' => false,
260  ];
261 
262  yield 'text with entities 14|...|0' => [
263  'expected' => 'Kasper Sk&aring;rh&oslash;j...',
264  'content' => $textWithEntities,
265  'numberOfChars' => 14,
266  'replacementForEllipsis' => '...',
267  'cropToSpace' => false,
268  ];
269 
270  yield 'text with entities 15|...|0' => [
271  'expected' => 'Kasper Sk&aring;rh&oslash;j ...',
272  'content' => $textWithEntities,
273  'numberOfChars' => 15,
274  'replacementForEllipsis' => '...',
275  'cropToSpace' => false,
276  ];
277 
278  yield 'text with entities 16|...|0' => [
279  'expected' => 'Kasper Sk&aring;rh&oslash;j i...',
280  'content' => $textWithEntities,
281  'numberOfChars' => 16,
282  'replacementForEllipsis' => '...',
283  'cropToSpace' => false,
284  ];
285 
286  yield 'text with entities -57|...|0' => [
287  'expected' => '...j implemented the; original version of the crop function.',
288  'content' => $textWithEntities,
289  'numberOfChars' => -57,
290  'replacementForEllipsis' => '...',
291  'cropToSpace' => false,
292  ];
293 
294  yield 'text with entities -58|...|0' => [
295  'expected' => '...&oslash;j implemented the; original version of the crop function.',
296  'content' => $textWithEntities,
297  'numberOfChars' => -58,
298  'replacementForEllipsis' => '...',
299  'cropToSpace' => false,
300  ];
301 
302  yield 'text with entities -59|...|0' => [
303  'expected' => '...h&oslash;j implemented the; original version of the crop function.',
304  'content' => $textWithEntities,
305  'numberOfChars' => -59,
306  'replacementForEllipsis' => '...',
307  'cropToSpace' => false,
308  ];
309 
310  yield 'text with entities 4|...|1' => [
311  'expected' => 'Kasp...',
312  'content' => $textWithEntities,
313  'numberOfChars' => 4,
314  'replacementForEllipsis' => '...',
315  'cropToSpace' => true,
316  ];
317 
318  yield 'text with entities 9|...|1' => [
319  'expected' => 'Kasper...',
320  'content' => $textWithEntities,
321  'numberOfChars' => 9,
322  'replacementForEllipsis' => '...',
323  'cropToSpace' => true,
324  ];
325 
326  yield 'text with entities 10|...|1' => [
327  'expected' => 'Kasper...',
328  'content' => $textWithEntities,
329  'numberOfChars' => 10,
330  'replacementForEllipsis' => '...',
331  'cropToSpace' => true,
332  ];
333 
334  yield 'text with entities 11|...|1' => [
335  'expected' => 'Kasper...',
336  'content' => $textWithEntities,
337  'numberOfChars' => 11,
338  'replacementForEllipsis' => '...',
339  'cropToSpace' => true,
340  ];
341 
342  yield 'text with entities 13|...|1' => [
343  'expected' => 'Kasper...',
344  'content' => $textWithEntities,
345  'numberOfChars' => 13,
346  'replacementForEllipsis' => '...',
347  'cropToSpace' => true,
348  ];
349 
350  yield 'text with entities 14|...|1' => [
351  'expected' => 'Kasper Sk&aring;rh&oslash;j...',
352  'content' => $textWithEntities,
353  'numberOfChars' => 14,
354  'replacementForEllipsis' => '...',
355  'cropToSpace' => true,
356  ];
357 
358  yield 'text with entities 15|...|1' => [
359  'expected' => 'Kasper Sk&aring;rh&oslash;j...',
360  'content' => $textWithEntities,
361  'numberOfChars' => 15,
362  'replacementForEllipsis' => '...',
363  'cropToSpace' => true,
364  ];
365 
366  yield 'text with entities 16|...|1' => [
367  'expected' => 'Kasper Sk&aring;rh&oslash;j...',
368  'content' => $textWithEntities,
369  'numberOfChars' => 16,
370  'replacementForEllipsis' => '...',
371  'cropToSpace' => true,
372  ];
373 
374  yield 'text with entities -57|...|1' => [
375  'expected' => '...implemented the; original version of the crop function.',
376  'content' => $textWithEntities,
377  'numberOfChars' => -57,
378  'replacementForEllipsis' => '...',
379  'cropToSpace' => true,
380  ];
381 
382  yield 'text with entities -58|...|1' => [
383  'expected' => '...implemented the; original version of the crop function.',
384  'content' => $textWithEntities,
385  'numberOfChars' => -58,
386  'replacementForEllipsis' => '...',
387  'cropToSpace' => true,
388  ];
389 
390  yield 'text with entities -59|...|1' => [
391  'expected' => '...implemented the; original version of the crop function.',
392  'content' => $textWithEntities,
393  'numberOfChars' => -59,
394  'replacementForEllipsis' => '...',
395  'cropToSpace' => true,
396  ];
397 
398  // some tests without prepared data
399  yield 'text with dash in html-element 28|...|1' => [
400  'expected' => 'Some text with a link to <link email.address@example.org - '
401  . 'mail "Open email window">my...</link>',
402  'content' => 'Some text with a link to <link email.address@example.org - m'
403  . 'ail "Open email window">my email.address@example.org<'
404  . '/link> and text after it',
405  'numberOfChars' => 28,
406  'replacementForEllipsis' => '...',
407  'cropToSpace' => true,
408  ];
409 
410  yield 'html elements with dashes in attributes' => [
411  'expected' => '<em data-foo="x">foobar</em>foo',
412  'content' => '<em data-foo="x">foobar</em>foo',
413  'numberOfChars' => 9,
414  'replacementForEllipsis' => '',
415  'cropToSpace' => false,
416  ];
417 
418  yield 'html elements with iframe embedded 24|...|1' => [
419  'expected' => 'Text with iframe <iframe src="//what.ever/"></iframe> and...',
420  'content' => 'Text with iframe <iframe src="//what.ever/">'
421  . '</iframe> and text after it',
422  'numberOfChars' => 24,
423  'replacementForEllipsis' => '...',
424  'cropToSpace' => true,
425  ];
426 
427  yield 'html elements with script tag embedded 24|...|1' => [
428  'expected' => 'Text with script <script>alert(\'foo\');</script> and...',
429  'content' => 'Text with script <script>alert(\'foo\');</script> '
430  . 'and text after it',
431  'numberOfChars' => 24,
432  'replacementForEllipsis' => '...',
433  'cropToSpace' => true,
434  ];
435 
436  // text with linebreaks
437  yield 'text with linebreaks' => [
438  'expected' => "Lorem ipsum dolor sit amet,\nconsetetur sadipscing elitr,\ns"
439  . 'ed diam nonumy eirmod tempor invidunt ut labore e'
440  . 't dolore magna',
441  'content' => $textWithLinebreaks,
442  'numberOfChars' => 121,
443  'replacementForEllipsis' => '',
444  'cropToSpace' => false,
445  ];
446 
447  // long texts
448  yield 'long text under the crop limit' => [
449  'expected' => 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit' . ' ...',
450  'content' => $textWith2000Chars,
451  'numberOfChars' => 962,
452  'replacementForEllipsis' => '...',
453  'cropToSpace' => false,
454  ];
455 
456  yield 'long text above the crop limit' => [
457  'expected' => 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ips &amp;. N' . '...',
458  'content' => $textWith2000Chars,
459  'numberOfChars' => 1000,
460  'replacementForEllipsis' => '...',
461  'cropToSpace' => false,
462  ];
463 
464  yield 'long text above the crop limit #2' => [
465  'expected' => 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ips &amp;. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc, quis gravida magna mi a libero. Fusce vulputate eleifend sapien. Vestibulum purus quam, scelerisque ut, mollis sed, nonummy id, metus. Nullam accumsan lorem in dui. Cras ultricies mi eu turpis hendrerit fringilla. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; In ac dui quis mi consectetuer lacinia. Nam pretium turpis et arcu. Duis arcu tortor, suscipit eget, imperdiet nec, imperdiet iaculis, ipsum. Sed aliquam ultrices mauris. Integer ante arcu, accumsan a, consectetuer eget, posuere ut, mauris. Praesent adipiscing. Phasellus ullamcorper ipsum rutrum nunc. Nunc nonummy metus. Vesti&amp;' . '...',
466  'content' => $textWith2000Chars . $textWith2000Chars,
467  'numberOfChars' => 2000,
468  'replacementForEllipsis' => '...',
469  'cropToSpace' => false,
470  ];
471 
472  // ensure that large number of html entities do not break the regexp splitting
473  yield 'long text with large number of html entities' => [
474  'expected' => $textWith1000AmpHtmlEntity . '...',
475  'content' => $textWith2000AmpHtmlEntity,
476  'numberOfChars' => 1000,
477  'replacementForEllipsis' => '...',
478  'cropToSpace' => false,
479  ];
480  }
481 
482  #[DataProvider('cropWorksDataProvicer')]
483  #[Test]
484  public function ‪cropWorks(string $expected, string $content, int $numberOfChars, string $replacementForEllipsis, bool $cropToSpace): void
485  {
486  $this->‪handleCharset($content, $expected);
487  self::assertEquals($expected, $this->subject->crop(
488  content: $content,
489  numberOfChars: $numberOfChars,
490  replacementForEllipsis: $replacementForEllipsis,
491  cropToSpace: $cropToSpace
492  ));
493  }
494 
501  protected function ‪handleCharset(string &‪$subject, string &$expected): void
502  {
503  ‪$subject = mb_convert_encoding(‪$subject, 'utf-8', 'iso-8859-1');
504  $expected = mb_convert_encoding($expected, 'utf-8', 'iso-8859-1');
505  }
506 }
‪TYPO3\CMS\Core\Tests\Unit\Html\HtmlCropperTest\cropIsMultibyteSafe
‪cropIsMultibyteSafe()
Definition: HtmlCropperTest.php:36
‪TYPO3\CMS\Core\Tests\Unit\Html\HtmlCropperTest\cropWorks
‪cropWorks(string $expected, string $content, int $numberOfChars, string $replacementForEllipsis, bool $cropToSpace)
Definition: HtmlCropperTest.php:484
‪TYPO3\CMS\Core\Tests\Unit\Html\HtmlCropperTest\setUp
‪setUp()
Definition: HtmlCropperTest.php:29
‪TYPO3\CMS\Core\Tests\Unit\Html\HtmlCropperTest
Definition: HtmlCropperTest.php:26
‪TYPO3\CMS\Core\Tests\Unit\Html\HtmlCropperTest\$subject
‪HtmlCropper $subject
Definition: HtmlCropperTest.php:27
‪TYPO3\CMS\Core\Tests\Unit\Html
Definition: HtmlCropperTest.php:18
‪TYPO3\CMS\Core\Tests\Unit\Html\HtmlCropperTest\cropWorksDataProvicer
‪static cropWorksDataProvicer()
Definition: HtmlCropperTest.php:47
‪TYPO3\CMS\Core\Html\HtmlCropper
Definition: HtmlCropper.php:24
‪TYPO3\CMS\Core\Tests\Unit\Html\HtmlCropperTest\handleCharset
‪handleCharset(string &$subject, string &$expected)
Definition: HtmlCropperTest.php:501