diff --git a/src/Reference.php b/src/Reference.php index 41e08190..27ac18b4 100644 --- a/src/Reference.php +++ b/src/Reference.php @@ -29,10 +29,16 @@ class Reference implements Hashable, Comparable, Immutable, Countable { /** * An array of Snak objects is only supported since version 1.1. * - * @param Snak[]|SnakList $snaks + * @param Snak[]|SnakList|Snak $snaks + * @param Snak [$snak2,...] + * * @throws InvalidArgumentException */ - public function __construct( $snaks = [] ) { + public function __construct( $snaks = [] /*...*/ ) { + if ( $snaks instanceof Snak ) { + $snaks = func_get_args(); + } + if ( is_array( $snaks ) ) { $snaks = new SnakList( $snaks ); } diff --git a/src/ReferenceList.php b/src/ReferenceList.php index 1c61e86c..4658ac31 100644 --- a/src/ReferenceList.php +++ b/src/ReferenceList.php @@ -33,11 +33,16 @@ class ReferenceList implements Comparable, Countable, IteratorAggregate, Seriali private $references = []; /** - * @param Reference[]|Traversable $references + * @param Reference[]|Traversable|Reference $references + * @param Reference [$reference2,...] * * @throws InvalidArgumentException */ - public function __construct( $references = [] ) { + public function __construct( $references = [] /*...*/ ) { + if ( $references instanceof Reference ) { + $references = func_get_args(); + } + if ( !is_array( $references ) && !( $references instanceof Traversable ) ) { throw new InvalidArgumentException( '$references must be an array or an instance of Traversable' ); } diff --git a/src/Snak/SnakList.php b/src/Snak/SnakList.php index 5de20d4a..9d4b700a 100644 --- a/src/Snak/SnakList.php +++ b/src/Snak/SnakList.php @@ -2,6 +2,8 @@ namespace Wikibase\DataModel\Snak; +use InvalidArgumentException; +use Traversable; use Wikibase\DataModel\HashArray; use Wikibase\DataModel\Internal\MapValueHasher; @@ -17,6 +19,26 @@ */ class SnakList extends HashArray { + /** + * @param Snak[]|Traversable|Snak $snaks + * @param Snak [$snak2,...] + * + * @throws InvalidArgumentException + */ + public function __construct( $snaks = array() /*...*/ ) { + if ( $snaks instanceof Snak ) { + $snaks = func_get_args(); + } + + if ( !is_array( $snaks ) && !( $snaks instanceof Traversable ) ) { + throw new InvalidArgumentException( '$snaks must be an array or an instance of Traversable' ); + } + + foreach ( $snaks as $index => $snak ) { + $this->setElement( $index, $snak ); + } + } + /** * @see GenericArrayObject::getObjectType * diff --git a/tests/unit/HashArray/HashArrayTest.php b/tests/unit/HashArray/HashArrayTest.php index 83323bc9..427cbd3d 100644 --- a/tests/unit/HashArray/HashArrayTest.php +++ b/tests/unit/HashArray/HashArrayTest.php @@ -35,7 +35,7 @@ public function instanceProvider() { $instances = []; foreach ( $this->constructorProvider() as $args ) { - $instances[] = [ new $class( array_key_exists( 0, $args ) ? $args[0] : null ) ]; + $instances[] = [ new $class( array_key_exists( 0, $args ) ? $args[0] : [] ) ]; } return $instances; diff --git a/tests/unit/ReferenceListTest.php b/tests/unit/ReferenceListTest.php index 9dc772ec..3d0435e7 100644 --- a/tests/unit/ReferenceListTest.php +++ b/tests/unit/ReferenceListTest.php @@ -75,7 +75,6 @@ public function invalidConstructorArgumentsProvider() { [ 'string' ], [ $id1 ], [ new PropertyNoValueSnak( $id1 ) ], - [ new Reference() ], [ new SnakList( [ new PropertyNoValueSnak( $id1 ) ] ) ], [ [ new PropertyNoValueSnak( $id1 ) ] ], [ [ new ReferenceList() ] ], diff --git a/tests/unit/ReferenceTest.php b/tests/unit/ReferenceTest.php index 1e7ad5e9..8e1a87e8 100644 --- a/tests/unit/ReferenceTest.php +++ b/tests/unit/ReferenceTest.php @@ -262,8 +262,7 @@ public function invalidConstructorArgumentsProvider() { [ 0.1 ], [ 'string' ], [ $id1 ], - [ new PropertyNoValueSnak( $id1 ) ], - [ new PropertyValueSnak( $id1, new StringValue( 'a' ) ) ], + [ [ new Reference() ] ], [ [ new SnakList() ] ], [ new Reference() ], ]; diff --git a/tests/unit/Snak/SnakListTest.php b/tests/unit/Snak/SnakListTest.php index ff5bb7aa..1f5b8478 100644 --- a/tests/unit/Snak/SnakListTest.php +++ b/tests/unit/Snak/SnakListTest.php @@ -84,13 +84,12 @@ public function invalidConstructorArgumentsProvider() { $id1 = new PropertyId( 'P1' ); return [ + [ null ], [ false ], [ 1 ], [ 0.1 ], [ 'string' ], [ $id1 ], - [ new PropertyNoValueSnak( $id1 ) ], - [ new PropertyValueSnak( $id1, new StringValue( 'a' ) ) ], [ [ null ] ], [ [ $id1 ] ], [ [ new SnakList() ] ], diff --git a/tests/unit/Statement/StatementTest.php b/tests/unit/Statement/StatementTest.php index 9e4ad6e6..ee08fae4 100644 --- a/tests/unit/Statement/StatementTest.php +++ b/tests/unit/Statement/StatementTest.php @@ -295,9 +295,7 @@ public function testGivenSameStatement_equalsReturnsTrue() { new SnakList( [ new PropertyNoValueSnak( 1337 ), ] ), - new ReferenceList( [ - new Reference( [ new PropertyNoValueSnak( 1337 ) ] ), - ] ) + new ReferenceList( new Reference( new PropertyNoValueSnak( 1337 ) ) ) ); $statement->setGuid( 'kittens' ); @@ -347,17 +345,13 @@ public function testStatementWithDifferentReferences_equalsReturnsFalse() { $statement = new Statement( new PropertyNoValueSnak( 42 ), new SnakList(), - new ReferenceList( [ - new Reference( [ new PropertyNoValueSnak( 1337 ) ] ), - ] ) + new ReferenceList( new Reference( new PropertyNoValueSnak( 1337 ) ) ) ); $differentStatement = new Statement( new PropertyNoValueSnak( 42 ), new SnakList(), - new ReferenceList( [ - new Reference( [ new PropertyNoValueSnak( 32202 ) ] ), - ] ) + new ReferenceList( new Reference( new PropertyNoValueSnak( 32202 ) ) ) ); $this->assertFalse( $statement->equals( $differentStatement ) ); @@ -406,9 +400,7 @@ private function newStatement() { $statement = new Statement( new PropertyNoValueSnak( 42 ), $qualifiers, - new ReferenceList( [ - new Reference( [ new PropertyNoValueSnak( 1337 ) ] ), - ] ) + new ReferenceList( new Reference( new PropertyNoValueSnak( 1337 ) ) ) ); $statement->setRank( Statement::RANK_NORMAL );