Merge "resourceloader: Make various CSSMin performance optimizations and cleanups"
[lhc/web/wiklou.git] / tests / phpunit / includes / Storage / RevisionSlotsTest.php
index 4dfae4b..95bba47 100644 (file)
@@ -2,21 +2,53 @@
 
 namespace MediaWiki\Tests\Storage;
 
+use InvalidArgumentException;
 use MediaWiki\Storage\RevisionAccessException;
 use MediaWiki\Storage\RevisionSlots;
 use MediaWiki\Storage\SlotRecord;
 use MediaWikiTestCase;
+use TextContent;
 use WikitextContent;
 
 class RevisionSlotsTest extends MediaWikiTestCase {
 
+       /**
+        * @param SlotRecord[] $slots
+        * @return RevisionSlots
+        */
+       protected function newRevisionSlots( $slots = [] ) {
+               return new RevisionSlots( $slots );
+       }
+
+       public function provideConstructorFailue() {
+               yield 'not an array or callable' => [
+                       'foo'
+               ];
+               yield 'array of the wrong thing' => [
+                       [ 1, 2, 3 ]
+               ];
+       }
+
+       /**
+        * @dataProvider provideConstructorFailue
+        * @param $slots
+        *
+        * @covers \MediaWiki\Storage\RevisionSlots::__construct
+        * @covers \MediaWiki\Storage\RevisionSlots::setSlotsInternal
+        */
+       public function testConstructorFailue( $slots ) {
+               $this->setExpectedException( InvalidArgumentException::class );
+
+               new RevisionSlots( $slots );
+       }
+
        /**
         * @covers \MediaWiki\Storage\RevisionSlots::getSlot
         */
        public function testGetSlot() {
                $mainSlot = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
                $auxSlot = SlotRecord::newUnsaved( 'aux', new WikitextContent( 'B' ) );
-               $slots = new RevisionSlots( [ $mainSlot, $auxSlot ] );
+               $slots = $this->newRevisionSlots( [ $mainSlot, $auxSlot ] );
 
                $this->assertSame( $mainSlot, $slots->getSlot( 'main' ) );
                $this->assertSame( $auxSlot, $slots->getSlot( 'aux' ) );
@@ -24,6 +56,20 @@ class RevisionSlotsTest extends MediaWikiTestCase {
                $slots->getSlot( 'nothere' );
        }
 
+       /**
+        * @covers \MediaWiki\Storage\RevisionSlots::hasSlot
+        */
+       public function testHasSlot() {
+               $mainSlot = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $auxSlot = SlotRecord::newUnsaved( 'aux', new WikitextContent( 'B' ) );
+               $slots = $this->newRevisionSlots( [ $mainSlot, $auxSlot ] );
+
+               $this->assertTrue( $slots->hasSlot( 'main' ) );
+               $this->assertTrue( $slots->hasSlot( 'aux' ) );
+               $this->assertFalse( $slots->hasSlot( 'AUX' ) );
+               $this->assertFalse( $slots->hasSlot( 'xyz' ) );
+       }
+
        /**
         * @covers \MediaWiki\Storage\RevisionSlots::getContent
         */
@@ -32,7 +78,7 @@ class RevisionSlotsTest extends MediaWikiTestCase {
                $auxContent = new WikitextContent( 'B' );
                $mainSlot = SlotRecord::newUnsaved( 'main', $mainContent );
                $auxSlot = SlotRecord::newUnsaved( 'aux', $auxContent );
-               $slots = new RevisionSlots( [ $mainSlot, $auxSlot ] );
+               $slots = $this->newRevisionSlots( [ $mainSlot, $auxSlot ] );
 
                $this->assertSame( $mainContent, $slots->getContent( 'main' ) );
                $this->assertSame( $auxContent, $slots->getContent( 'aux' ) );
@@ -46,7 +92,7 @@ class RevisionSlotsTest extends MediaWikiTestCase {
        public function testGetSlotRoles_someSlots() {
                $mainSlot = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
                $auxSlot = SlotRecord::newUnsaved( 'aux', new WikitextContent( 'B' ) );
-               $slots = new RevisionSlots( [ $mainSlot, $auxSlot ] );
+               $slots = $this->newRevisionSlots( [ $mainSlot, $auxSlot ] );
 
                $this->assertSame( [ 'main', 'aux' ], $slots->getSlotRoles() );
        }
@@ -55,7 +101,7 @@ class RevisionSlotsTest extends MediaWikiTestCase {
         * @covers \MediaWiki\Storage\RevisionSlots::getSlotRoles
         */
        public function testGetSlotRoles_noSlots() {
-               $slots = new RevisionSlots( [] );
+               $slots = $this->newRevisionSlots( [] );
 
                $this->assertSame( [], $slots->getSlotRoles() );
        }
@@ -67,11 +113,45 @@ class RevisionSlotsTest extends MediaWikiTestCase {
                $mainSlot = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
                $auxSlot = SlotRecord::newUnsaved( 'aux', new WikitextContent( 'B' ) );
                $slotsArray = [ $mainSlot, $auxSlot ];
-               $slots = new RevisionSlots( $slotsArray );
+               $slots = $this->newRevisionSlots( $slotsArray );
 
                $this->assertEquals( [ 'main' => $mainSlot, 'aux' => $auxSlot ], $slots->getSlots() );
        }
 
+       /**
+        * @covers \MediaWiki\Storage\RevisionSlots::getInheritedSlots
+        */
+       public function testGetInheritedSlots() {
+               $mainSlot = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $auxSlot = SlotRecord::newInherited(
+                       SlotRecord::newSaved(
+                               7, 7, 'foo',
+                               SlotRecord::newUnsaved( 'aux', new WikitextContent( 'B' ) )
+                       )
+               );
+               $slotsArray = [ $mainSlot, $auxSlot ];
+               $slots = $this->newRevisionSlots( $slotsArray );
+
+               $this->assertEquals( [ 'aux' => $auxSlot ], $slots->getInheritedSlots() );
+       }
+
+       /**
+        * @covers \MediaWiki\Storage\RevisionSlots::getTouchedSlots
+        */
+       public function testGetTouchedSlots() {
+               $mainSlot = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $auxSlot = SlotRecord::newInherited(
+                       SlotRecord::newSaved(
+                               7, 7, 'foo',
+                               SlotRecord::newUnsaved( 'aux', new WikitextContent( 'B' ) )
+                       )
+               );
+               $slotsArray = [ $mainSlot, $auxSlot ];
+               $slots = $this->newRevisionSlots( $slotsArray );
+
+               $this->assertEquals( [ 'main' => $mainSlot ], $slots->getTouchedSlots() );
+       }
+
        public function provideComputeSize() {
                yield [ 1, [ 'A' ] ];
                yield [ 2, [ 'AA' ] ];
@@ -87,7 +167,7 @@ class RevisionSlotsTest extends MediaWikiTestCase {
                foreach ( $contentStrings as $key => $contentString ) {
                        $slotsArray[] = SlotRecord::newUnsaved( strval( $key ), new WikitextContent( $contentString ) );
                }
-               $slots = new RevisionSlots( $slotsArray );
+               $slots = $this->newRevisionSlots( $slotsArray );
 
                $this->assertSame( $expected, $slots->computeSize() );
        }
@@ -109,9 +189,39 @@ class RevisionSlotsTest extends MediaWikiTestCase {
                foreach ( $contentStrings as $key => $contentString ) {
                        $slotsArray[] = SlotRecord::newUnsaved( strval( $key ), new WikitextContent( $contentString ) );
                }
-               $slots = new RevisionSlots( $slotsArray );
+               $slots = $this->newRevisionSlots( $slotsArray );
 
                $this->assertSame( $expected, $slots->computeSha1() );
        }
 
+       public function provideHasSameContent() {
+               $fooX = SlotRecord::newUnsaved( 'x', new TextContent( 'Foo' ) );
+               $barZ = SlotRecord::newUnsaved( 'z', new TextContent( 'Bar' ) );
+               $fooY = SlotRecord::newUnsaved( 'y', new TextContent( 'Foo' ) );
+               $barZS = SlotRecord::newSaved( 7, 7, 'xyz', $barZ );
+               $barZ2 = SlotRecord::newUnsaved( 'z', new TextContent( 'Baz' ) );
+
+               $a = $this->newRevisionSlots( [ 'x' => $fooX, 'z' => $barZ ] );
+               $a2 = $this->newRevisionSlots( [ 'x' => $fooX, 'z' => $barZ ] );
+               $a3 = $this->newRevisionSlots( [ 'x' => $fooX, 'z' => $barZS ] );
+               $b = $this->newRevisionSlots( [ 'y' => $fooY, 'z' => $barZ ] );
+               $c = $this->newRevisionSlots( [ 'x' => $fooX, 'z' => $barZ2 ] );
+
+               yield 'same instance' => [ $a, $a, true ];
+               yield 'same slots' => [ $a, $a2, true ];
+               yield 'same content' => [ $a, $a3, true ];
+
+               yield 'different roles' => [ $a, $b, false ];
+               yield 'different content' => [ $a, $c, false ];
+       }
+
+       /**
+        * @dataProvider provideHasSameContent
+        * @covers \MediaWiki\Storage\RevisionSlots::hasSameContent
+        */
+       public function testHasSameContent( RevisionSlots $a, RevisionSlots $b, $same ) {
+               $this->assertSame( $same, $a->hasSameContent( $b ) );
+               $this->assertSame( $same, $b->hasSameContent( $a ) );
+       }
+
 }