Skip to content

Commit 1dbc3fd

Browse files
JeroenDeDauwthiemowmde
authored andcommitted
Ignore empty references when added to ReferenceList
1 parent 9b588fe commit 1dbc3fd

5 files changed

Lines changed: 96 additions & 27 deletions

File tree

RELEASE-NOTES.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212

1313
## Version 2.6.0 (dev)
1414

15+
* Added `Reference::isEmpty`
1516
* Empty strings are now detected as invalid in the `SiteLink` constructor
17+
* Empty References are now ignored when added to `ReferenceList`
1618
* The `ReferenceList` constructor now throws an `InvalidArgumentException` when getting a non-iterable input
1719
* The `SnakList` constructor now throws an `InvalidArgumentException` when getting a non-iterable input
1820
* The `AliasGroup::equals` and `Term::equals` methods no longer incorrectly return true for fallback objects

src/Reference.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,15 @@ public function count() {
6767
return count( $this->snaks );
6868
}
6969

70+
/**
71+
* @since 2.6
72+
*
73+
* @return bool
74+
*/
75+
public function isEmpty() {
76+
return $this->snaks->isEmpty();
77+
}
78+
7079
/**
7180
* @see Hashable::getHash
7281
*

src/ReferenceList.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,17 @@ public function addReference( Reference $reference, $index = null ) {
7070
}
7171
}
7272

73+
/**
74+
* @see SplObjectStorage::attach
75+
* @param Reference $reference
76+
* @param mixed $data
77+
*/
78+
public function attach( $reference, $data = null ) {
79+
if ( !$reference->isEmpty() ) {
80+
parent::attach( $reference, $data );
81+
}
82+
}
83+
7384
// @codingStandardsIgnoreStart
7485
/**
7586
* @since 1.1

tests/unit/ReferenceListTest.php

Lines changed: 60 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Wikibase\DataModel\Reference;
99
use Wikibase\DataModel\ReferenceList;
1010
use Wikibase\DataModel\Snak\PropertyNoValueSnak;
11+
use Wikibase\DataModel\Snak\PropertyValueSnak;
1112
use Wikibase\DataModel\Snak\SnakList;
1213

1314
/**
@@ -141,41 +142,73 @@ public function testRemoveReference( ReferenceList $array ) {
141142
$this->assertTrue( true );
142143
}
143144

144-
/**
145-
* @dataProvider instanceProvider
146-
*
147-
* @param ReferenceList $array
148-
*/
149-
public function testAddReference( ReferenceList $array ) {
150-
// Append object to the end:
151-
$elementCount = count( $array );
145+
public function testAddReferenceOnEmptyList() {
146+
$reference = new Reference( array( new PropertyNoValueSnak( 1 ) ) );
152147

153-
$elements = $this->getElementInstances();
154-
$element = array_shift( $elements );
155-
$array->addReference( $element );
148+
$references = new ReferenceList();
149+
$references->addReference( $reference );
156150

157-
$this->assertEquals( ++$elementCount, count( $array ) );
151+
$this->assertCount( 1, $references );
158152

159-
// Insert object at the beginning:
160-
$elements = $this->getElementInstances();
161-
$element = array_shift( $elements );
162-
$array->addReference( $element, 0 );
153+
$expectedList = new ReferenceList( array( $reference ) );
154+
$this->assertSameReferenceOrder( $expectedList, $references );
155+
}
156+
157+
private function assertSameReferenceOrder( ReferenceList $expectedList, ReferenceList $references ) {
158+
$this->assertEquals(
159+
iterator_to_array( $expectedList ),
160+
iterator_to_array( $references )
161+
);
162+
}
163163

164-
$array->rewind();
164+
public function testAddReferenceOnNonEmptyList() {
165+
$reference1 = new Reference( array( new PropertyNoValueSnak( 1 ) ) );
166+
$reference2 = new Reference( array( new PropertyNoValueSnak( 2 ) ) );
167+
$reference3 = new Reference( array( new PropertyNoValueSnak( 3 ) ) );
165168

166-
$this->assertEquals( ++$elementCount, count( $array ) );
167-
$this->assertEquals( $array->current(), $element, 'Inserted object at the beginning' );
169+
$references = new ReferenceList( array( $reference1, $reference2 ) );
170+
$references->addReference( $reference3 );
168171

169-
// Insert object at another index:
170-
$elements = $this->getElementInstances();
171-
$element = array_shift( $elements );
172-
$array->addReference( $element, 1 );
172+
$this->assertCount( 3, $references );
173+
174+
$expectedList = new ReferenceList( array( $reference1, $reference2, $reference3 ) );
175+
$this->assertSameReferenceOrder( $expectedList, $references );
176+
}
177+
178+
public function testAddReferenceAtIndexZero() {
179+
$reference1 = new Reference( array( new PropertyNoValueSnak( 1 ) ) );
180+
$reference2 = new Reference( array( new PropertyNoValueSnak( 2 ) ) );
181+
$reference3 = new Reference( array( new PropertyNoValueSnak( 3 ) ) );
182+
183+
$references = new ReferenceList( array( $reference1, $reference2 ) );
184+
$references->addReference( $reference3, 0 );
185+
186+
$expectedList = new ReferenceList( array( $reference3, $reference1, $reference2 ) );
187+
$this->assertSameReferenceOrder( $expectedList, $references );
188+
}
189+
190+
public function testGivenEmptyReference_addReferenceDoesNotAdd() {
191+
$reference1 = new Reference( array( new PropertyNoValueSnak( 1 ) ) );
192+
$reference2 = new Reference( array( new PropertyNoValueSnak( 2 ) ) );
193+
$emptyReference = new Reference( array() );
194+
195+
$references = new ReferenceList( array( $reference1, $reference2 ) );
196+
$references->addReference( $emptyReference );
197+
198+
$expectedList = new ReferenceList( array( $reference1, $reference2 ) );
199+
$this->assertSameReferenceOrder( $expectedList, $references );
200+
}
201+
202+
public function testGivenEmptyReferenceAndIndex_addReferenceDoesNotAdd() {
203+
$reference1 = new Reference( array( new PropertyNoValueSnak( 1 ) ) );
204+
$reference2 = new Reference( array( new PropertyNoValueSnak( 2 ) ) );
205+
$emptyReference = new Reference( array() );
173206

174-
$array->rewind();
175-
$array->next();
207+
$references = new ReferenceList( array( $reference1, $reference2 ) );
208+
$references->addReference( $emptyReference, 0 );
176209

177-
$this->assertEquals( ++$elementCount, count( $array ) );
178-
$this->assertEquals( $array->current(), $element, 'Inserted object at index 1' );
210+
$expectedList = new ReferenceList( array( $reference1, $reference2 ) );
211+
$this->assertSameReferenceOrder( $expectedList, $references );
179212
}
180213

181214
/**

tests/unit/ReferenceTest.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,4 +280,18 @@ public function invalidConstructorArgumentsProvider() {
280280
);
281281
}
282282

283+
public function testIsEmpty() {
284+
$emptyReference = new Reference();
285+
$this->assertTrue( $emptyReference->isEmpty() );
286+
287+
$referenceWithSnak = new Reference( array( new PropertyNoValueSnak( 1 ) ) );
288+
$this->assertFalse( $referenceWithSnak->isEmpty() );
289+
290+
$referenceWithSnaks = new Reference( array(
291+
new PropertyNoValueSnak( 1 ),
292+
new PropertyNoValueSnak( 2 )
293+
) );
294+
$this->assertFalse( $referenceWithSnaks->isEmpty() );
295+
}
296+
283297
}

0 commit comments

Comments
 (0)