Skip to content

Commit 106b77e

Browse files
committed
Merge pull request #483 from wmde/fix-setstatements
Dont modifiy StatementList when invalid arguments passed to setStatements
2 parents 18b491b + d8d274a commit 106b77e

2 files changed

Lines changed: 53 additions & 3 deletions

File tree

src/Statement/StatementList.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,17 @@ public function setStatements( $statements ) {
6060
throw new InvalidArgumentException( '$statements must be an array or an instance of Traversable' );
6161
}
6262

63-
$this->statements = array();
63+
$statementsToSet = array();
64+
6465
foreach ( $statements as $statement ) {
6566
if ( !( $statement instanceof Statement ) ) {
6667
throw new InvalidArgumentException( 'Every element in $statements must be an instance of Statement' );
6768
}
6869

69-
$this->addStatement( $statement );
70+
$statementsToSet[] = $statement;
7071
}
72+
73+
$this->statements = $statementsToSet;
7174
}
7275

7376
/**
@@ -119,6 +122,8 @@ public function addNewStatement( Snak $mainSnak, $qualifiers = null, $references
119122
}
120123

121124
/**
125+
* @since 3.0
126+
*
122127
* @param string|null $guid
123128
*/
124129
public function removeStatementsWithGuid( $guid ) {

tests/unit/Statement/StatementListTest.php

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Wikibase\DataModel\Tests\Statement;
44

55
use DataValues\StringValue;
6+
use InvalidArgumentException;
67
use Wikibase\DataModel\Claim\Claims;
78
use Wikibase\DataModel\Entity\PropertyId;
89
use Wikibase\DataModel\Snak\PropertyNoValueSnak;
@@ -694,12 +695,56 @@ public function testGivenFilledStatementList_setStatementsOverridesIt() {
694695
);
695696
}
696697

697-
public function testGivenNoTraversable_setStatementsThrowsException() {
698+
public function testGivenNonTraversable_setStatementsThrowsException() {
698699
$statement1 = $this->getStatement( 1, 'guid1' );
699700
$statements = new StatementList();
700701

701702
$this->setExpectedException( 'InvalidArgumentException' );
702703
$statements->setStatements( $statement1 );
703704
}
704705

706+
public function testGivenNonStatement_setStatementsThrowsException() {
707+
$statement1 = $this->getStatement( 1, 'guid1' );
708+
$statements = new StatementList();
709+
710+
$this->setExpectedException( 'InvalidArgumentException' );
711+
$statements->setStatements( array( $statement1, false ) );
712+
}
713+
714+
public function testGivenNonTraversable_setStatementsDoesNotEditList() {
715+
$statement1 = $this->getStatement( 1, 'guid1' );
716+
$statement2 = $this->getStatement( 2, 'guid2' );
717+
$statement3 = $this->getStatement( 3, 'guid3' );
718+
$statement4 = $this->getStatement( 2, 'guid5' );
719+
$statements = new StatementList( $statement1, $statement2, $statement3, $statement4 );
720+
721+
try {
722+
$statements->setStatements( $statement1 );
723+
}
724+
catch ( InvalidArgumentException $e ) {
725+
$this->assertEquals(
726+
new StatementList( $statement1, $statement2, $statement3, $statement4 ),
727+
$statements
728+
);
729+
}
730+
}
731+
732+
public function testGivenNonStatement_setStatementsDoesNotEditList() {
733+
$statement1 = $this->getStatement( 1, 'guid1' );
734+
$statement2 = $this->getStatement( 2, 'guid2' );
735+
$statement3 = $this->getStatement( 3, 'guid3' );
736+
$statement4 = $this->getStatement( 2, 'guid5' );
737+
$statements = new StatementList( $statement1, $statement2, $statement3, $statement4 );
738+
739+
try {
740+
$statements->setStatements( array( $statement4, false ) );
741+
}
742+
catch ( InvalidArgumentException $e ) {
743+
$this->assertEquals(
744+
new StatementList( $statement1, $statement2, $statement3, $statement4 ),
745+
$statements
746+
);
747+
}
748+
}
749+
705750
}

0 commit comments

Comments
 (0)