ILIAS  trunk Revision v11.0_alpha-2645-g16283d3b3f8
EstimatedReadingTimeTest.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
22 
23 require_once 'vendor/composer/vendor/autoload.php';
24 
29 use stdClass;
32 
33 class EstimatedReadingTimeTest extends TestCase
34 {
35  private const TEXT = <<<EOT
36 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. 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.
37 EOT;
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>
40 EOT;
41 
42  private const HTML_WITH_NON_XHTML_URLS = <<<EOT
43 <a href="http://www.ilias.de=foo=1&bar=2">ILIAS</a>
44 EOT;
45 
46  private Refinery $refinery;
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 
106  public function testReadingTimeForPlainTextCanBeDetermined(): void
107  {
108  $readingTimeTrafo = $this->refinery->string()->estimatedReadingTime(true);
109  $this->assertEquals(
110  1,
111  $readingTimeTrafo->transform(self::TEXT)
112  );
113  }
114 
115  public function testReadingTimeForHtmlFragmentCanBeDetermined(): void
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 
132  public function testSolitaryPunctuationCharactersMustNotAffectReadingTime(): void
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 
151  public function testXTHMLCommentsMustNotAffectReadingTime(): void
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')]
167  public function testNoExceptionIsRaisedIfHtmlContainsUnsupportedEntities(string $text): void
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 
177  public function testNoExceptionIsRaisedIfHtmlContainsAmpersandInUrls(): void
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 }
Interface Observer Contains several chained tasks and infos about them.
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
$comment
Definition: buildRTE.php:72