ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
EstimatedReadingTimeTest.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
22
23require_once 'vendor/composer/vendor/autoload.php';
24
26use ILIAS\Data\Factory as DataFactory;
28use PHPUnit\Framework\TestCase;
29use stdClass;
30use InvalidArgumentException;
31use PHPUnit\Framework\Attributes\DataProvider;
32
33class EstimatedReadingTimeTest extends TestCase
34{
35 private const TEXT = <<<EOT
36Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
37EOT;
38 private const HTML = <<<EOT
39<div>Lorem ipsum dolor <span style="color: red;">sit amet</span>, <img src="#" /> consetetur sadipscing elitr, sed diam nonumy eirmod <img src="#" /> tempor invidunt <img src="#" /> ut labore et dolore <img src="#" /> magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor <img src="#" /> sit amet. <img src="#" /> Lorem ipsum dolor <img src="#" /> sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, <img src="#" /> sed diam voluptua. <img src="#" /> At vero eos et accusam et justo duo dolores et ea rebum. Stet <img src="#" /> clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</div>
40EOT;
41
42 private const HTML_WITH_NON_XHTML_URLS = <<<EOT
43<a href="http://www.ilias.de=foo=1&bar=2">ILIAS</a>
44EOT;
45
47
48 protected function setUp(): void
49 {
50 $this->refinery = new Refinery(
51 $this->createMock(DataFactory::class),
52 $this->createMock(Language::class)
53 );
54
55 parent::setUp();
56 }
57
61 public static function inputProvider(): array
62 {
63 return [
64 [5],
65 [6.3],
66 [[]],
67 [new stdClass()],
68 [true],
69 [null],
70 [static function (): void {
71 }],
72 ];
73 }
74
78 public static function unsupportedButKnownEntitiesProvider(): array
79 {
80 return array_map(static function (string $entity): array {
81 return [
82 '<div>Lorem ipsum dolor <' . $entity . '></' . $entity . '></div>'
83 ];
84 }, [
85 'figure',
86 'figcaption',
87 'nav',
88 'section',
89 'header',
90 'article',
91 'footer',
92 'aside',
93 'noindex',
94 ]);
95 }
96
97 #[DataProvider('inputProvider')]
98 public function testExceptionIsRaisedIfInputIsNotAString(mixed $from): void
99 {
100 $this->expectException(InvalidArgumentException::class);
101 $readingTimeTrafo = $this->refinery->string()->estimatedReadingTime(true);
102
103 $readingTimeTrafo->transform($from);
104 }
105
107 {
108 $readingTimeTrafo = $this->refinery->string()->estimatedReadingTime(true);
109 $this->assertEquals(
110 1,
111 $readingTimeTrafo->transform(self::TEXT)
112 );
113 }
114
116 {
117 $text = self::HTML;
118
119 $readingTimeTrafo = $this->refinery->string()->estimatedReadingTime(true);
120 $this->assertEquals(
121 2,
122 $readingTimeTrafo->transform($text)
123 );
124
125 $onlyTextReadingTimeInfo = $this->refinery->string()->estimatedReadingTime();
126 $this->assertEquals(
127 1,
128 $onlyTextReadingTimeInfo->transform($text)
129 );
130 }
131
133 {
134 $textSegmentWithPunctuation = 'Lorem ipsum <img src="#" />, and some other text... ';
135 $repetitions = 300; // 275 repetitions result in an additional minute, if the `,` would be considered
136
137 $readingTimeTrafo = $this->refinery->string()->estimatedReadingTime(true);
138
139 $text = str_repeat($textSegmentWithPunctuation, $repetitions);
140
141 $timeInMinutes = $readingTimeTrafo->transform($text);
142 $this->assertEquals(23, $timeInMinutes);
143
144 $textSegmentWithoutPunctuation = 'Lorem ipsum <img src="#" /> and some other text... ';
145 $text = str_repeat($textSegmentWithoutPunctuation, $repetitions);
146
147 $timeInMinutes = $readingTimeTrafo->transform($text);
148 $this->assertEquals(23, $timeInMinutes);
149 }
150
152 {
153 $text = self::HTML;
154
155 $comment = '<script><!--a comment--></script>';
156 $repetitions = 300;
157 $text .= str_repeat($comment, $repetitions);
158
159 $onlyTextReadingTimeInfo = $this->refinery->string()->estimatedReadingTime();
160 $this->assertEquals(
161 1,
162 $onlyTextReadingTimeInfo->transform($text)
163 );
164 }
165
166 #[DataProvider('unsupportedButKnownEntitiesProvider')]
168 {
169 $reading_time_trafo = $this->refinery->string()->estimatedReadingTime(true);
170
171 $reading_time = $reading_time_trafo->transform($text);
172
173 $this->assertIsInt($reading_time);
174 $this->assertGreaterThan(0, $reading_time);
175 }
176
178 {
179 $reading_time_trafo = $this->refinery->string()->estimatedReadingTime(true);
180
181 $reading_time = $reading_time_trafo->transform(self::HTML_WITH_NON_XHTML_URLS);
182
183 $this->assertIsInt($reading_time);
184 $this->assertGreaterThan(0, $reading_time);
185 }
186}
$comment
Definition: buildRTE.php:72
Builds data types.
Definition: Factory.php:36
Interface Observer \BackgroundTasks Contains several chained tasks and infos about them.