3 namespace MediaWiki\Tests\Revision
;
6 use InvalidArgumentException
;
7 use MediaWiki\Revision\MutableRevisionSlots
;
8 use MediaWiki\Revision\RevisionAccessException
;
9 use MediaWiki\Revision\RevisionSlots
;
10 use MediaWiki\Revision\SlotRecord
;
14 * @covers \MediaWiki\Revision\MutableRevisionSlots
16 class MutableRevisionSlotsTest
extends RevisionSlotsTest
{
19 * @param SlotRecord[] $slots
20 * @return RevisionSlots
22 protected function newRevisionSlots( $slots = [] ) {
23 return new MutableRevisionSlots( $slots );
26 public function provideConstructorFailue() {
27 yield
'array or the wrong thing' => [
33 * @dataProvider provideConstructorFailue
36 * @covers \MediaWiki\Revision\RevisionSlots::__construct
37 * @covers \MediaWiki\Revision\RevisionSlots::setSlotsInternal
39 public function testConstructorFailue( $slots ) {
40 $this->setExpectedException( InvalidArgumentException
::class );
42 new MutableRevisionSlots( $slots );
45 public function testSetMultipleSlots() {
46 $slots = new MutableRevisionSlots();
48 $this->assertSame( [], $slots->getSlots() );
50 $slotA = SlotRecord
::newUnsaved( 'some', new WikitextContent( 'A' ) );
51 $slots->setSlot( $slotA );
52 $this->assertTrue( $slots->hasSlot( 'some' ) );
53 $this->assertSame( $slotA, $slots->getSlot( 'some' ) );
54 $this->assertSame( [ 'some' => $slotA ], $slots->getSlots() );
56 $slotB = SlotRecord
::newUnsaved( 'other', new WikitextContent( 'B' ) );
57 $slots->setSlot( $slotB );
58 $this->assertTrue( $slots->hasSlot( 'other' ) );
59 $this->assertSame( $slotB, $slots->getSlot( 'other' ) );
60 $this->assertSame( [ 'some' => $slotA, 'other' => $slotB ], $slots->getSlots() );
63 public function testSetExistingSlotOverwritesSlot() {
64 $slots = new MutableRevisionSlots();
66 $this->assertSame( [], $slots->getSlots() );
68 $slotA = SlotRecord
::newUnsaved( SlotRecord
::MAIN
, new WikitextContent( 'A' ) );
69 $slots->setSlot( $slotA );
70 $this->assertSame( $slotA, $slots->getSlot( SlotRecord
::MAIN
) );
71 $this->assertSame( [ 'main' => $slotA ], $slots->getSlots() );
73 $slotB = SlotRecord
::newUnsaved( SlotRecord
::MAIN
, new WikitextContent( 'B' ) );
74 $slots->setSlot( $slotB );
75 $this->assertSame( $slotB, $slots->getSlot( SlotRecord
::MAIN
) );
76 $this->assertSame( [ 'main' => $slotB ], $slots->getSlots() );
81 * @param Content $content
84 private function newSavedSlot( $role, Content
$content ) {
85 return SlotRecord
::newSaved( 7, 7, 'xyz', SlotRecord
::newUnsaved( $role, $content ) );
88 public function testInheritSlotOverwritesSlot() {
89 $slots = new MutableRevisionSlots();
90 $slotA = SlotRecord
::newUnsaved( SlotRecord
::MAIN
, new WikitextContent( 'A' ) );
91 $slots->setSlot( $slotA );
92 $slotB = $this->newSavedSlot( SlotRecord
::MAIN
, new WikitextContent( 'B' ) );
93 $slotC = $this->newSavedSlot( 'foo', new WikitextContent( 'C' ) );
94 $slots->inheritSlot( $slotB );
95 $slots->inheritSlot( $slotC );
96 $this->assertSame( [ 'main', 'foo' ], $slots->getSlotRoles() );
97 $this->assertNotSame( $slotB, $slots->getSlot( SlotRecord
::MAIN
) );
98 $this->assertNotSame( $slotC, $slots->getSlot( 'foo' ) );
99 $this->assertTrue( $slots->getSlot( SlotRecord
::MAIN
)->isInherited() );
100 $this->assertTrue( $slots->getSlot( 'foo' )->isInherited() );
101 $this->assertSame( $slotB->getContent(), $slots->getSlot( SlotRecord
::MAIN
)->getContent() );
102 $this->assertSame( $slotC->getContent(), $slots->getSlot( 'foo' )->getContent() );
105 public function testSetContentOfExistingSlotOverwritesContent() {
106 $slots = new MutableRevisionSlots();
108 $this->assertSame( [], $slots->getSlots() );
110 $slotA = SlotRecord
::newUnsaved( SlotRecord
::MAIN
, new WikitextContent( 'A' ) );
111 $slots->setSlot( $slotA );
112 $this->assertSame( $slotA, $slots->getSlot( SlotRecord
::MAIN
) );
113 $this->assertSame( [ 'main' => $slotA ], $slots->getSlots() );
115 $newContent = new WikitextContent( 'B' );
116 $slots->setContent( SlotRecord
::MAIN
, $newContent );
117 $this->assertSame( $newContent, $slots->getContent( SlotRecord
::MAIN
) );
120 public function testRemoveExistingSlot() {
121 $slotA = SlotRecord
::newUnsaved( SlotRecord
::MAIN
, new WikitextContent( 'A' ) );
122 $slots = new MutableRevisionSlots( [ $slotA ] );
124 $this->assertSame( [ 'main' => $slotA ], $slots->getSlots() );
126 $slots->removeSlot( SlotRecord
::MAIN
);
127 $this->assertSame( [], $slots->getSlots() );
128 $this->setExpectedException( RevisionAccessException
::class );
129 $slots->getSlot( SlotRecord
::MAIN
);
132 public function testNewFromParentRevisionSlots() {
133 /** @var SlotRecord[] $parentSlots */
135 'some' => $this->newSavedSlot( 'some', new WikitextContent( 'X' ) ),
136 'other' => $this->newSavedSlot( 'other', new WikitextContent( 'Y' ) ),
138 $slots = MutableRevisionSlots
::newFromParentRevisionSlots( $parentSlots );
139 $this->assertSame( [ 'some', 'other' ], $slots->getSlotRoles() );
140 $this->assertNotSame( $parentSlots['some'], $slots->getSlot( 'some' ) );
141 $this->assertNotSame( $parentSlots['other'], $slots->getSlot( 'other' ) );
142 $this->assertTrue( $slots->getSlot( 'some' )->isInherited() );
143 $this->assertTrue( $slots->getSlot( 'other' )->isInherited() );
144 $this->assertSame( $parentSlots['some']->getContent(), $slots->getContent( 'some' ) );
145 $this->assertSame( $parentSlots['other']->getContent(), $slots->getContent( 'other' ) );