Skip to content

Commit 403c110

Browse files
committed
Merge pull request #664 from wmde/addStatementAtIndex
Add index parameter to StatementList::addStatement
2 parents 713ddb7 + c365af2 commit 403c110

2 files changed

Lines changed: 58 additions & 6 deletions

File tree

src/Statement/StatementList.php

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
* @license GPL-2.0+
2727
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
2828
* @author Bene* < benestar.wikimedia@gmail.com >
29+
* @author Thiemo Mättig
2930
*/
3031
class StatementList implements IteratorAggregate, Comparable, Countable {
3132

@@ -74,8 +75,23 @@ public function getPropertyIds() {
7475
return $propertyIds;
7576
}
7677

77-
public function addStatement( Statement $statement ) {
78-
$this->statements[] = $statement;
78+
/**
79+
* @since 1.0, setting an index is supported since 6.1
80+
* @see ReferenceList::addReference
81+
*
82+
* @param Statement $statement
83+
* @param int|null $index New position of the added statement, or null to append.
84+
*
85+
* @throws InvalidArgumentException
86+
*/
87+
public function addStatement( Statement $statement, $index = null ) {
88+
if ( $index === null ) {
89+
$this->statements[] = $statement;
90+
} elseif ( is_int( $index ) && $index >= 0 ) {
91+
array_splice( $this->statements, $index, 0, array( $statement ) );
92+
} else {
93+
throw new InvalidArgumentException( '$index must be a non-negative integer or null' );
94+
}
7995
}
8096

8197
/**
@@ -91,7 +107,7 @@ public function addNewStatement( Snak $mainSnak, $qualifiers = null, $references
91107
$statement = new Statement( $mainSnak, $qualifiers, $references );
92108
$statement->setGuid( $guid );
93109

94-
$this->addStatement( $statement );
110+
$this->statements[] = $statement;
95111
}
96112

97113
/**
@@ -139,7 +155,7 @@ public function getByPropertyId( PropertyId $id ) {
139155

140156
foreach ( $this->statements as $statement ) {
141157
if ( $statement->getPropertyId()->equals( $id ) ) {
142-
$statementList->addStatement( $statement );
158+
$statementList->statements[] = $statement;
143159
}
144160
}
145161

@@ -159,7 +175,7 @@ public function getByRank( $acceptableRanks ) {
159175

160176
foreach ( $this->statements as $statement ) {
161177
if ( array_key_exists( $statement->getRank(), $acceptableRanks ) ) {
162-
$statementList->addStatement( $statement );
178+
$statementList->statements[] = $statement;
163179
}
164180
}
165181

@@ -318,7 +334,7 @@ public function filter( StatementFilter $filter ) {
318334

319335
foreach ( $this->statements as $statement ) {
320336
if ( $filter->statementMatches( $statement ) ) {
321-
$statementList->addStatement( $statement );
337+
$statementList->statements[] = $statement;
322338
}
323339
}
324340

tests/unit/Statement/StatementListTest.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,42 @@ public function testAddStatementWithGuid() {
236236
$this->assertEquals( new StatementList( $statement ), $list );
237237
}
238238

239+
public function testGivenNegativeIndex_addStatementFails() {
240+
$statement = new Statement( new PropertyNoValueSnak( 1 ) );
241+
$list = new StatementList();
242+
243+
$this->setExpectedException( 'InvalidArgumentException' );
244+
$list->addStatement( $statement, -1 );
245+
}
246+
247+
public function testGivenLargeIndex_addStatementAppends() {
248+
$statement = new Statement( new PropertyNoValueSnak( 1 ) );
249+
$list = new StatementList();
250+
251+
$list->addStatement( $statement, 1000 );
252+
$this->assertEquals( new StatementList( $statement ), $list );
253+
}
254+
255+
public function testGivenZeroIndex_addStatementPrepends() {
256+
$statement1 = new Statement( new PropertyNoValueSnak( 1 ) );
257+
$statement2 = new Statement( new PropertyNoValueSnak( 2 ) );
258+
$list = new StatementList( $statement2 );
259+
260+
$list->addStatement( $statement1, 0 );
261+
$this->assertEquals( new StatementList( $statement1, $statement2 ), $list );
262+
}
263+
264+
public function testGivenValidIndex_addStatementInserts() {
265+
$statement1 = new Statement( new PropertyNoValueSnak( 1 ) );
266+
$statement2 = new Statement( new PropertyNoValueSnak( 2 ) );
267+
$statement3 = new Statement( new PropertyNoValueSnak( 3 ) );
268+
$list = new StatementList( $statement1, $statement3 );
269+
270+
$list->addStatement( $statement2, 1 );
271+
$this->assertEquals( new StatementList( $statement1, $statement2, $statement3 ), $list );
272+
$this->assertSame( array( 0, 1, 2 ), array_keys( $list->toArray() ), 'array keys' );
273+
}
274+
239275
public function testGivenGuidOfPresentStatement_statementIsRemoved() {
240276
$statement1 = new Statement( $this->newSnak( 24, 'foo' ), null, null, 'foo' );
241277
$statement2 = new Statement( $this->newSnak( 32, 'bar' ), null, null, 'bar' );

0 commit comments

Comments
 (0)