ILIAS  release_8 Revision v8.23
EstimatedReadingTimeTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
22 
23 require_once 'libs/composer/vendor/autoload.php';
24 
27 use ilLanguage;
29 use stdClass;
32 
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(ilLanguage::class)
53  );
54 
55  parent::setUp();
56  }
57 
61  public 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 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 
101  public function testExceptionIsRaisedIfInputIsNotAString($from): void
102  {
103  $this->expectException(InvalidArgumentException::class);
104  $readingTimeTrafo = $this->refinery->string()->estimatedReadingTime(true);
105 
106  $readingTimeTrafo->transform($from);
107  }
108 
109  public function testReadingTimeForPlainTextCanBeDetermined(): void
110  {
111  $readingTimeTrafo = $this->refinery->string()->estimatedReadingTime(true);
112  $this->assertEquals(
113  1,
114  $readingTimeTrafo->transform(self::TEXT)
115  );
116  }
117 
118  public function testReadingTimeForHtmlFragmentCanBeDetermined(): void
119  {
120  $text = self::HTML;
121 
122  $readingTimeTrafo = $this->refinery->string()->estimatedReadingTime(true);
123  $this->assertEquals(
124  2,
125  $readingTimeTrafo->transform($text)
126  );
127 
128  $onlyTextReadingTimeInfo = $this->refinery->string()->estimatedReadingTime();
129  $this->assertEquals(
130  1,
131  $onlyTextReadingTimeInfo->transform($text)
132  );
133  }
134 
135  public function testSolitaryPunctuationCharactersMustNotAffectReadingTime(): void
136  {
137  $textSegmentWithPunctuation = 'Lorem ipsum <img src="#" />, and some other text... ';
138  $repetitions = 300; // 275 repetitions result in an additional minute, if the `,` would be considered
139 
140  $readingTimeTrafo = $this->refinery->string()->estimatedReadingTime(true);
141 
142  $text = str_repeat($textSegmentWithPunctuation, $repetitions);
143 
144  $timeInMinutes = $readingTimeTrafo->transform($text);
145  $this->assertEquals(23, $timeInMinutes);
146 
147  $textSegmentWithoutPunctuation = 'Lorem ipsum <img src="#" /> and some other text... ';
148  $text = str_repeat($textSegmentWithoutPunctuation, $repetitions);
149 
150  $timeInMinutes = $readingTimeTrafo->transform($text);
151  $this->assertEquals(23, $timeInMinutes);
152  }
153 
154  public function testXTHMLCommentsMustNotAffectReadingTime(): void
155  {
156  $text = self::HTML;
157 
158  $comment = '<script><!--a comment--></script>';
159  $repetitions = 300;
160  $text .= str_repeat($comment, $repetitions);
161 
162  $onlyTextReadingTimeInfo = $this->refinery->string()->estimatedReadingTime();
163  $this->assertEquals(
164  1,
165  $onlyTextReadingTimeInfo->transform($text)
166  );
167  }
168 
173  public function testNoExceptionIsRaisedIfHtmlContainsUnsupportedEntities(string $text): void
174  {
175  $reading_time_trafo = $this->refinery->string()->estimatedReadingTime(true);
176 
177  $reading_time = $reading_time_trafo->transform($text);
178 
179  $this->assertIsInt($reading_time);
180  $this->assertGreaterThan(0, $reading_time);
181  }
182 
183  public function testNoExceptionIsRaisedIfHtmlContainsAmpersandInUrls(): void
184  {
185  $reading_time_trafo = $this->refinery->string()->estimatedReadingTime(true);
186 
187  $reading_time = $reading_time_trafo->transform(self::HTML_WITH_NON_XHTML_URLS);
188 
189  $this->assertIsInt($reading_time);
190  $this->assertGreaterThan(0, $reading_time);
191  }
192 }
Class ChatMainBarProvider .
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
$comment
Definition: buildRTE.php:72
Refinery Factory $refinery