MutableRevisionSlotsTest.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <?php
  2. namespace MediaWiki\Tests\Storage;
  3. use Content;
  4. use InvalidArgumentException;
  5. use MediaWiki\Storage\MutableRevisionSlots;
  6. use MediaWiki\Storage\RevisionAccessException;
  7. use MediaWiki\Storage\RevisionSlots;
  8. use MediaWiki\Storage\SlotRecord;
  9. use WikitextContent;
  10. /**
  11. * @covers \MediaWiki\Storage\MutableRevisionSlots
  12. */
  13. class MutableRevisionSlotsTest extends RevisionSlotsTest {
  14. /**
  15. * @param SlotRecord[] $slots
  16. * @return RevisionSlots
  17. */
  18. protected function newRevisionSlots( $slots = [] ) {
  19. return new MutableRevisionSlots( $slots );
  20. }
  21. public function provideConstructorFailue() {
  22. yield 'array or the wrong thing' => [
  23. [ 1, 2, 3 ]
  24. ];
  25. }
  26. /**
  27. * @dataProvider provideConstructorFailue
  28. * @param $slots
  29. *
  30. * @covers \MediaWiki\Storage\RevisionSlots::__construct
  31. * @covers \MediaWiki\Storage\RevisionSlots::setSlotsInternal
  32. */
  33. public function testConstructorFailue( $slots ) {
  34. $this->setExpectedException( InvalidArgumentException::class );
  35. new MutableRevisionSlots( $slots );
  36. }
  37. public function testSetMultipleSlots() {
  38. $slots = new MutableRevisionSlots();
  39. $this->assertSame( [], $slots->getSlots() );
  40. $slotA = SlotRecord::newUnsaved( 'some', new WikitextContent( 'A' ) );
  41. $slots->setSlot( $slotA );
  42. $this->assertTrue( $slots->hasSlot( 'some' ) );
  43. $this->assertSame( $slotA, $slots->getSlot( 'some' ) );
  44. $this->assertSame( [ 'some' => $slotA ], $slots->getSlots() );
  45. $slotB = SlotRecord::newUnsaved( 'other', new WikitextContent( 'B' ) );
  46. $slots->setSlot( $slotB );
  47. $this->assertTrue( $slots->hasSlot( 'other' ) );
  48. $this->assertSame( $slotB, $slots->getSlot( 'other' ) );
  49. $this->assertSame( [ 'some' => $slotA, 'other' => $slotB ], $slots->getSlots() );
  50. }
  51. public function testSetExistingSlotOverwritesSlot() {
  52. $slots = new MutableRevisionSlots();
  53. $this->assertSame( [], $slots->getSlots() );
  54. $slotA = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
  55. $slots->setSlot( $slotA );
  56. $this->assertSame( $slotA, $slots->getSlot( 'main' ) );
  57. $this->assertSame( [ 'main' => $slotA ], $slots->getSlots() );
  58. $slotB = SlotRecord::newUnsaved( 'main', new WikitextContent( 'B' ) );
  59. $slots->setSlot( $slotB );
  60. $this->assertSame( $slotB, $slots->getSlot( 'main' ) );
  61. $this->assertSame( [ 'main' => $slotB ], $slots->getSlots() );
  62. }
  63. /**
  64. * @param string $role
  65. * @param Content $content
  66. * @return SlotRecord
  67. */
  68. private function newSavedSlot( $role, Content $content ) {
  69. return SlotRecord::newSaved( 7, 7, 'xyz', SlotRecord::newUnsaved( $role, $content ) );
  70. }
  71. public function testInheritSlotOverwritesSlot() {
  72. $slots = new MutableRevisionSlots();
  73. $slotA = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
  74. $slots->setSlot( $slotA );
  75. $slotB = $this->newSavedSlot( 'main', new WikitextContent( 'B' ) );
  76. $slotC = $this->newSavedSlot( 'foo', new WikitextContent( 'C' ) );
  77. $slots->inheritSlot( $slotB );
  78. $slots->inheritSlot( $slotC );
  79. $this->assertSame( [ 'main', 'foo' ], $slots->getSlotRoles() );
  80. $this->assertNotSame( $slotB, $slots->getSlot( 'main' ) );
  81. $this->assertNotSame( $slotC, $slots->getSlot( 'foo' ) );
  82. $this->assertTrue( $slots->getSlot( 'main' )->isInherited() );
  83. $this->assertTrue( $slots->getSlot( 'foo' )->isInherited() );
  84. $this->assertSame( $slotB->getContent(), $slots->getSlot( 'main' )->getContent() );
  85. $this->assertSame( $slotC->getContent(), $slots->getSlot( 'foo' )->getContent() );
  86. }
  87. public function testSetContentOfExistingSlotOverwritesContent() {
  88. $slots = new MutableRevisionSlots();
  89. $this->assertSame( [], $slots->getSlots() );
  90. $slotA = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
  91. $slots->setSlot( $slotA );
  92. $this->assertSame( $slotA, $slots->getSlot( 'main' ) );
  93. $this->assertSame( [ 'main' => $slotA ], $slots->getSlots() );
  94. $newContent = new WikitextContent( 'B' );
  95. $slots->setContent( 'main', $newContent );
  96. $this->assertSame( $newContent, $slots->getContent( 'main' ) );
  97. }
  98. public function testRemoveExistingSlot() {
  99. $slotA = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
  100. $slots = new MutableRevisionSlots( [ $slotA ] );
  101. $this->assertSame( [ 'main' => $slotA ], $slots->getSlots() );
  102. $slots->removeSlot( 'main' );
  103. $this->assertSame( [], $slots->getSlots() );
  104. $this->setExpectedException( RevisionAccessException::class );
  105. $slots->getSlot( 'main' );
  106. }
  107. public function testNewFromParentRevisionSlots() {
  108. /** @var SlotRecord[] $parentSlots */
  109. $parentSlots = [
  110. 'some' => $this->newSavedSlot( 'some', new WikitextContent( 'X' ) ),
  111. 'other' => $this->newSavedSlot( 'other', new WikitextContent( 'Y' ) ),
  112. ];
  113. $slots = MutableRevisionSlots::newFromParentRevisionSlots( $parentSlots );
  114. $this->assertSame( [ 'some', 'other' ], $slots->getSlotRoles() );
  115. $this->assertNotSame( $parentSlots['some'], $slots->getSlot( 'some' ) );
  116. $this->assertNotSame( $parentSlots['other'], $slots->getSlot( 'other' ) );
  117. $this->assertTrue( $slots->getSlot( 'some' )->isInherited() );
  118. $this->assertTrue( $slots->getSlot( 'other' )->isInherited() );
  119. $this->assertSame( $parentSlots['some']->getContent(), $slots->getContent( 'some' ) );
  120. $this->assertSame( $parentSlots['other']->getContent(), $slots->getContent( 'other' ) );
  121. }
  122. }