Merge "Recognize exif values for Apple iOS photo modes"
[lhc/web/wiklou.git] / tests / phpunit / includes / Storage / RevisionSlotsUpdateTest.php
index 5b392c8..442f4d2 100644 (file)
@@ -2,10 +2,12 @@
 
 namespace MediaWiki\Tests\Storage;
 
-use MediaWiki\Storage\RevisionSlots;
+use Content;
+use MediaWiki\Revision\MutableRevisionSlots;
+use MediaWiki\Revision\RevisionSlots;
+use MediaWiki\Revision\RevisionAccessException;
+use MediaWiki\Revision\SlotRecord;
 use MediaWiki\Storage\RevisionSlotsUpdate;
-use MediaWiki\Storage\RevisionAccessException;
-use MediaWiki\Storage\SlotRecord;
 use MediaWikiTestCase;
 use WikitextContent;
 
@@ -41,8 +43,8 @@ class RevisionSlotsUpdateTest extends MediaWikiTestCase {
         *
         * @param RevisionSlots $newSlots
         * @param RevisionSlots $parentSlots
-        * @param $modified
-        * @param $removed
+        * @param string[] $modified
+        * @param string[] $removed
         */
        public function testNewFromRevisionSlots(
                RevisionSlots $newSlots,
@@ -60,6 +62,44 @@ class RevisionSlotsUpdateTest extends MediaWikiTestCase {
                }
        }
 
+       public function provideNewFromContent() {
+               $slotA = SlotRecord::newUnsaved( 'A', new WikitextContent( 'A' ) );
+               $slotB = SlotRecord::newUnsaved( 'B', new WikitextContent( 'B' ) );
+               $slotC = SlotRecord::newUnsaved( 'C', new WikitextContent( 'C' ) );
+
+               $parentSlots = new RevisionSlots( [
+                       'A' => $slotA,
+                       'B' => $slotB,
+                       'C' => $slotC,
+               ] );
+
+               $newContent = [
+                       'A' => new WikitextContent( 'A' ),
+                       'B' => new WikitextContent( 'B2' ),
+               ];
+
+               yield [ $newContent, null, [ 'A', 'B' ] ];
+               yield [ $newContent, $parentSlots, [ 'B' ] ];
+       }
+
+       /**
+        * @dataProvider provideNewFromContent
+        *
+        * @param Content[] $newContent
+        * @param RevisionSlots $parentSlots
+        * @param string[] $modified
+        */
+       public function testNewFromContent(
+               array $newContent,
+               RevisionSlots $parentSlots = null,
+               array $modified = []
+       ) {
+               $update = RevisionSlotsUpdate::newFromContent( $newContent, $parentSlots );
+
+               $this->assertEquals( $modified, $update->getModifiedRoles() );
+               $this->assertEmpty( $update->getRemovedRoles() );
+       }
+
        public function testConstructor() {
                $update = new RevisionSlotsUpdate();
 
@@ -118,25 +158,25 @@ class RevisionSlotsUpdateTest extends MediaWikiTestCase {
        public function testRemoveSlot() {
                $slots = new RevisionSlotsUpdate();
 
-               $slotA = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $slotA = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $slots->modifySlot( $slotA );
 
                $this->assertSame( [ 'main' ], $slots->getModifiedRoles() );
 
-               $slots->removeSlot( 'main' );
+               $slots->removeSlot( SlotRecord::MAIN );
                $slots->removeSlot( 'other' );
                $this->assertSame( [], $slots->getModifiedRoles() );
                $this->assertSame( [ 'main', 'other' ], $slots->getRemovedRoles() );
-               $this->assertTrue( $slots->isRemovedSlot( 'main' ) );
+               $this->assertTrue( $slots->isRemovedSlot( SlotRecord::MAIN ) );
                $this->assertTrue( $slots->isRemovedSlot( 'other' ) );
-               $this->assertFalse( $slots->isModifiedSlot( 'main' ) );
+               $this->assertFalse( $slots->isModifiedSlot( SlotRecord::MAIN ) );
 
                // removing the same slot again should not trigger an error
-               $slots->removeSlot( 'main' );
+               $slots->removeSlot( SlotRecord::MAIN );
 
                // getting a slot after removing it should fail
                $this->setExpectedException( RevisionAccessException::class );
-               $slots->getModifiedSlot( 'main' );
+               $slots->getModifiedSlot( SlotRecord::MAIN );
        }
 
        public function testGetModifiedRoles() {
@@ -144,26 +184,26 @@ class RevisionSlotsUpdateTest extends MediaWikiTestCase {
 
                $this->assertSame( [], $slots->getModifiedRoles() );
 
-               $slots->modifyContent( 'main', new WikitextContent( 'A' ) );
+               $slots->modifyContent( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $slots->modifyContent( 'foo', new WikitextContent( 'Foo' ) );
                $this->assertSame( [ 'main', 'foo' ], $slots->getModifiedRoles() );
 
-               $slots->removeSlot( 'main' );
+               $slots->removeSlot( SlotRecord::MAIN );
                $this->assertSame( [ 'foo' ], $slots->getModifiedRoles() );
        }
 
        public function testGetRemovedRoles() {
-               $slotA = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $slotA = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $slots = new RevisionSlotsUpdate( [ $slotA ] );
 
                $this->assertSame( [], $slots->getRemovedRoles() );
 
-               $slots->removeSlot( 'main', new WikitextContent( 'A' ) );
+               $slots->removeSlot( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $slots->removeSlot( 'foo', new WikitextContent( 'Foo' ) );
 
                $this->assertSame( [ 'main', 'foo' ], $slots->getRemovedRoles() );
 
-               $slots->modifyContent( 'main', new WikitextContent( 'A' ) );
+               $slots->modifyContent( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $this->assertSame( [ 'foo' ], $slots->getRemovedRoles() );
        }
 
@@ -204,4 +244,34 @@ class RevisionSlotsUpdateTest extends MediaWikiTestCase {
                $this->assertSame( $same, $b->hasSameUpdates( $a ) );
        }
 
+       /**
+        * @param string $role
+        * @param Content $content
+        * @return SlotRecord
+        */
+       private function newSavedSlot( $role, Content $content ) {
+               return SlotRecord::newSaved( 7, 7, 'xyz', SlotRecord::newUnsaved( $role, $content ) );
+       }
+
+       public function testApplyUpdate() {
+               /** @var SlotRecord[] $parentSlots */
+               $parentSlots = [
+                       'X' => $this->newSavedSlot( 'X', new WikitextContent( 'X' ) ),
+                       'Y' => $this->newSavedSlot( 'Y', new WikitextContent( 'Y' ) ),
+                       'Z' => $this->newSavedSlot( 'Z', new WikitextContent( 'Z' ) ),
+               ];
+               $slots = MutableRevisionSlots::newFromParentRevisionSlots( $parentSlots );
+               $update = RevisionSlotsUpdate::newFromContent( [
+                       'A' => new WikitextContent( 'A' ),
+                       'Y' => new WikitextContent( 'yyy' ),
+               ] );
+
+               $update->removeSlot( 'Z' );
+
+               $update->apply( $slots );
+               $this->assertSame( [ 'X', 'Y', 'A' ], $slots->getSlotRoles() );
+               $this->assertSame( $update->getModifiedSlot( 'A' ), $slots->getSlot( 'A' ) );
+               $this->assertSame( $update->getModifiedSlot( 'Y' ), $slots->getSlot( 'Y' ) );
+       }
+
 }