summaryrefslogtreecommitdiff
path: root/www/wiki/tests/phpunit/includes/parser/StripStateTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/tests/phpunit/includes/parser/StripStateTest.php')
-rw-r--r--www/wiki/tests/phpunit/includes/parser/StripStateTest.php136
1 files changed, 136 insertions, 0 deletions
diff --git a/www/wiki/tests/phpunit/includes/parser/StripStateTest.php b/www/wiki/tests/phpunit/includes/parser/StripStateTest.php
new file mode 100644
index 00000000..0f4f6e0f
--- /dev/null
+++ b/www/wiki/tests/phpunit/includes/parser/StripStateTest.php
@@ -0,0 +1,136 @@
+<?php
+
+/**
+ * @covers StripState
+ */
+class StripStateTest extends MediaWikiTestCase {
+ public function setUp() {
+ parent::setUp();
+ $this->setContentLang( 'qqx' );
+ }
+
+ private function getMarker() {
+ static $i;
+ return Parser::MARKER_PREFIX . '-blah-' . sprintf( '%08X', $i++ ) . Parser::MARKER_SUFFIX;
+ }
+
+ private static function getWarning( $message, $max = '' ) {
+ return "<span class=\"error\">($message: $max)</span>";
+ }
+
+ public function testAddNoWiki() {
+ $ss = new StripState;
+ $marker = $this->getMarker();
+ $ss->addNoWiki( $marker, '<>' );
+ $text = "x{$marker}y";
+ $text = $ss->unstripGeneral( $text );
+ $text = str_replace( '<', '', $text );
+ $text = $ss->unstripNoWiki( $text );
+ $this->assertSame( 'x<>y', $text );
+ }
+
+ public function testAddGeneral() {
+ $ss = new StripState;
+ $marker = $this->getMarker();
+ $ss->addGeneral( $marker, '<>' );
+ $text = "x{$marker}y";
+ $text = $ss->unstripNoWiki( $text );
+ $text = str_replace( '<', '', $text );
+ $text = $ss->unstripGeneral( $text );
+ $this->assertSame( 'x<>y', $text );
+ }
+
+ public function testUnstripBoth() {
+ $ss = new StripState;
+ $mk1 = $this->getMarker();
+ $mk2 = $this->getMarker();
+ $ss->addNoWiki( $mk1, '<1>' );
+ $ss->addGeneral( $mk2, '<2>' );
+ $text = "x{$mk1}{$mk2}y";
+ $text = str_replace( '<', '', $text );
+ $text = $ss->unstripBoth( $text );
+ $this->assertSame( 'x<1><2>y', $text );
+ }
+
+ public static function provideUnstripRecursive() {
+ return [
+ [ 0, 'text' ],
+ [ 1, '=text=' ],
+ [ 2, '==text==' ],
+ [ 3, '==' . self::getWarning( 'unstrip-depth-warning', 2 ) . '==' ],
+ ];
+ }
+
+ /** @dataProvider provideUnstripRecursive */
+ public function testUnstripRecursive( $depth, $expected ) {
+ $ss = new StripState( null, [ 'depthLimit' => 2 ] );
+ $text = 'text';
+ for ( $i = 0; $i < $depth; $i++ ) {
+ $mk = $this->getMarker();
+ $ss->addNoWiki( $mk, "={$text}=" );
+ $text = $mk;
+ }
+ $text = $ss->unstripNoWiki( $text );
+ $this->assertSame( $expected, $text );
+ }
+
+ public function testUnstripLoop() {
+ $ss = new StripState( null, [ 'depthLimit' => 2 ] );
+ $mk = $this->getMarker();
+ $ss->addNoWiki( $mk, $mk );
+ $text = $ss->unstripNoWiki( $mk );
+ $this->assertSame( self::getWarning( 'parser-unstrip-loop-warning' ), $text );
+ }
+
+ public static function provideUnstripSize() {
+ return [
+ [ 0, 'x' ],
+ [ 1, 'xx' ],
+ [ 2, str_repeat( self::getWarning( 'unstrip-size-warning', 5 ), 2 ) ]
+ ];
+ }
+
+ /** @dataProvider provideUnstripSize */
+ public function testUnstripSize( $depth, $expected ) {
+ $ss = new StripState( null, [ 'sizeLimit' => 5 ] );
+ $text = 'x';
+ for ( $i = 0; $i < $depth; $i++ ) {
+ $mk = $this->getMarker();
+ $ss->addNoWiki( $mk, $text );
+ $text = "$mk$mk";
+ }
+ $text = $ss->unstripNoWiki( $text );
+ $this->assertSame( $expected, $text );
+ }
+
+ public function provideGetLimitReport() {
+ for ( $i = 1; $i < 4; $i++ ) {
+ yield [ $i ];
+ }
+ }
+
+ /** @dataProvider provideGetLimitReport */
+ public function testGetLimitReport( $depth ) {
+ $sizeLimit = 100000;
+ $ss = new StripState( null, [ 'depthLimit' => 5, 'sizeLimit' => $sizeLimit ] );
+ $text = 'x';
+ for ( $i = 0; $i < $depth; $i++ ) {
+ $mk = $this->getMarker();
+ $ss->addNoWiki( $mk, $text );
+ $text = "$mk$mk";
+ }
+ $text = $ss->unstripNoWiki( $text );
+ $report = $ss->getLimitReport();
+ $messages = [];
+ foreach ( $report as list( $msg, $params ) ) {
+ $messages[$msg] = $params;
+ }
+ $this->assertSame( [ $depth - 1, 5 ], $messages['limitreport-unstrip-depth'] );
+ $this->assertSame(
+ [
+ strlen( $this->getMarker() ) * 2 * ( pow( 2, $depth ) - 2 ) + pow( 2, $depth ),
+ $sizeLimit
+ ],
+ $messages['limitreport-unstrip-size' ] );
+ }
+}