3 namespace MediaWiki\Tests\Storage
;
5 use InvalidArgumentException
;
6 use MediaWiki\Storage\RevisionAccessException
;
7 use MediaWiki\Storage\RevisionSlots
;
8 use MediaWiki\Storage\SlotRecord
;
13 class RevisionSlotsTest
extends MediaWikiTestCase
{
16 * @param SlotRecord[] $slots
17 * @return RevisionSlots
19 protected function newRevisionSlots( $slots = [] ) {
20 return new RevisionSlots( $slots );
23 public function provideConstructorFailue() {
24 yield
'not an array or callable' => [
27 yield
'array of the wrong thing' => [
33 * @dataProvider provideConstructorFailue
36 * @covers \MediaWiki\Storage\RevisionSlots::__construct
37 * @covers \MediaWiki\Storage\RevisionSlots::setSlotsInternal
39 public function testConstructorFailue( $slots ) {
40 $this->setExpectedException( InvalidArgumentException
::class );
42 new RevisionSlots( $slots );
46 * @covers \MediaWiki\Storage\RevisionSlots::getSlot
48 public function testGetSlot() {
49 $mainSlot = SlotRecord
::newUnsaved( 'main', new WikitextContent( 'A' ) );
50 $auxSlot = SlotRecord
::newUnsaved( 'aux', new WikitextContent( 'B' ) );
51 $slots = $this->newRevisionSlots( [ $mainSlot, $auxSlot ] );
53 $this->assertSame( $mainSlot, $slots->getSlot( 'main' ) );
54 $this->assertSame( $auxSlot, $slots->getSlot( 'aux' ) );
55 $this->setExpectedException( RevisionAccessException
::class );
56 $slots->getSlot( 'nothere' );
60 * @covers \MediaWiki\Storage\RevisionSlots::hasSlot
62 public function testHasSlot() {
63 $mainSlot = SlotRecord
::newUnsaved( 'main', new WikitextContent( 'A' ) );
64 $auxSlot = SlotRecord
::newUnsaved( 'aux', new WikitextContent( 'B' ) );
65 $slots = $this->newRevisionSlots( [ $mainSlot, $auxSlot ] );
67 $this->assertTrue( $slots->hasSlot( 'main' ) );
68 $this->assertTrue( $slots->hasSlot( 'aux' ) );
69 $this->assertFalse( $slots->hasSlot( 'AUX' ) );
70 $this->assertFalse( $slots->hasSlot( 'xyz' ) );
74 * @covers \MediaWiki\Storage\RevisionSlots::getContent
76 public function testGetContent() {
77 $mainContent = new WikitextContent( 'A' );
78 $auxContent = new WikitextContent( 'B' );
79 $mainSlot = SlotRecord
::newUnsaved( 'main', $mainContent );
80 $auxSlot = SlotRecord
::newUnsaved( 'aux', $auxContent );
81 $slots = $this->newRevisionSlots( [ $mainSlot, $auxSlot ] );
83 $this->assertSame( $mainContent, $slots->getContent( 'main' ) );
84 $this->assertSame( $auxContent, $slots->getContent( 'aux' ) );
85 $this->setExpectedException( RevisionAccessException
::class );
86 $slots->getContent( 'nothere' );
90 * @covers \MediaWiki\Storage\RevisionSlots::getSlotRoles
92 public function testGetSlotRoles_someSlots() {
93 $mainSlot = SlotRecord
::newUnsaved( 'main', new WikitextContent( 'A' ) );
94 $auxSlot = SlotRecord
::newUnsaved( 'aux', new WikitextContent( 'B' ) );
95 $slots = $this->newRevisionSlots( [ $mainSlot, $auxSlot ] );
97 $this->assertSame( [ 'main', 'aux' ], $slots->getSlotRoles() );
101 * @covers \MediaWiki\Storage\RevisionSlots::getSlotRoles
103 public function testGetSlotRoles_noSlots() {
104 $slots = $this->newRevisionSlots( [] );
106 $this->assertSame( [], $slots->getSlotRoles() );
110 * @covers \MediaWiki\Storage\RevisionSlots::getSlots
112 public function testGetSlots() {
113 $mainSlot = SlotRecord
::newUnsaved( 'main', new WikitextContent( 'A' ) );
114 $auxSlot = SlotRecord
::newUnsaved( 'aux', new WikitextContent( 'B' ) );
115 $slotsArray = [ $mainSlot, $auxSlot ];
116 $slots = $this->newRevisionSlots( $slotsArray );
118 $this->assertEquals( [ 'main' => $mainSlot, 'aux' => $auxSlot ], $slots->getSlots() );
122 * @covers \MediaWiki\Storage\RevisionSlots::getInheritedSlots
124 public function testGetInheritedSlots() {
125 $mainSlot = SlotRecord
::newUnsaved( 'main', new WikitextContent( 'A' ) );
126 $auxSlot = SlotRecord
::newInherited(
127 SlotRecord
::newSaved(
129 SlotRecord
::newUnsaved( 'aux', new WikitextContent( 'B' ) )
132 $slotsArray = [ $mainSlot, $auxSlot ];
133 $slots = $this->newRevisionSlots( $slotsArray );
135 $this->assertEquals( [ 'aux' => $auxSlot ], $slots->getInheritedSlots() );
139 * @covers \MediaWiki\Storage\RevisionSlots::getTouchedSlots
141 public function testGetTouchedSlots() {
142 $mainSlot = SlotRecord
::newUnsaved( 'main', new WikitextContent( 'A' ) );
143 $auxSlot = SlotRecord
::newInherited(
144 SlotRecord
::newSaved(
146 SlotRecord
::newUnsaved( 'aux', new WikitextContent( 'B' ) )
149 $slotsArray = [ $mainSlot, $auxSlot ];
150 $slots = $this->newRevisionSlots( $slotsArray );
152 $this->assertEquals( [ 'main' => $mainSlot ], $slots->getTouchedSlots() );
155 public function provideComputeSize() {
156 yield
[ 1, [ 'A' ] ];
157 yield
[ 2, [ 'AA' ] ];
158 yield
[ 4, [ 'AA', 'X', 'H' ] ];
162 * @dataProvider provideComputeSize
163 * @covers \MediaWiki\Storage\RevisionSlots::computeSize
165 public function testComputeSize( $expected, $contentStrings ) {
167 foreach ( $contentStrings as $key => $contentString ) {
168 $slotsArray[] = SlotRecord
::newUnsaved( strval( $key ), new WikitextContent( $contentString ) );
170 $slots = $this->newRevisionSlots( $slotsArray );
172 $this->assertSame( $expected, $slots->computeSize() );
175 public function provideComputeSha1() {
176 yield
[ 'ctqm7794fr2dp1taki8a88ovwnvmnmj', [ 'A' ] ];
177 yield
[ 'eyq8wiwlcofnaiy4eid97gyfy60uw51', [ 'AA' ] ];
178 yield
[ 'lavctqfpxartyjr31f853drgfl4kj1g', [ 'AA', 'X', 'H' ] ];
182 * @dataProvider provideComputeSha1
183 * @covers \MediaWiki\Storage\RevisionSlots::computeSha1
184 * @note this test is a bit brittle as the hashes are hardcoded, perhaps just check that strings
185 * are returned and different Slots objects return different strings?
187 public function testComputeSha1( $expected, $contentStrings ) {
189 foreach ( $contentStrings as $key => $contentString ) {
190 $slotsArray[] = SlotRecord
::newUnsaved( strval( $key ), new WikitextContent( $contentString ) );
192 $slots = $this->newRevisionSlots( $slotsArray );
194 $this->assertSame( $expected, $slots->computeSha1() );
197 public function provideHasSameContent() {
198 $fooX = SlotRecord
::newUnsaved( 'x', new TextContent( 'Foo' ) );
199 $barZ = SlotRecord
::newUnsaved( 'z', new TextContent( 'Bar' ) );
200 $fooY = SlotRecord
::newUnsaved( 'y', new TextContent( 'Foo' ) );
201 $barZS = SlotRecord
::newSaved( 7, 7, 'xyz', $barZ );
202 $barZ2 = SlotRecord
::newUnsaved( 'z', new TextContent( 'Baz' ) );
204 $a = $this->newRevisionSlots( [ 'x' => $fooX, 'z' => $barZ ] );
205 $a2 = $this->newRevisionSlots( [ 'x' => $fooX, 'z' => $barZ ] );
206 $a3 = $this->newRevisionSlots( [ 'x' => $fooX, 'z' => $barZS ] );
207 $b = $this->newRevisionSlots( [ 'y' => $fooY, 'z' => $barZ ] );
208 $c = $this->newRevisionSlots( [ 'x' => $fooX, 'z' => $barZ2 ] );
210 yield
'same instance' => [ $a, $a, true ];
211 yield
'same slots' => [ $a, $a2, true ];
212 yield
'same content' => [ $a, $a3, true ];
214 yield
'different roles' => [ $a, $b, false ];
215 yield
'different content' => [ $a, $c, false ];
219 * @dataProvider provideHasSameContent
220 * @covers \MediaWiki\Storage\RevisionSlots::hasSameContent
222 public function testHasSameContent( RevisionSlots
$a, RevisionSlots
$b, $same ) {
223 $this->assertSame( $same, $a->hasSameContent( $b ) );
224 $this->assertSame( $same, $b->hasSameContent( $a ) );