123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- <?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' ] );
- }
- }
|