|
4 | 4 |
|
5 | 5 | use Wikibase\DataModel\Entity\Item; |
6 | 6 | use Wikibase\DataModel\Entity\ItemId; |
7 | | -use Wikibase\DataModel\Entity\PropertyId; |
8 | 7 | use Wikibase\DataModel\SiteLink; |
9 | 8 | use Wikibase\DataModel\Snak\PropertyNoValueSnak; |
| 9 | +use Wikibase\DataModel\Snak\PropertySomeValueSnak; |
10 | 10 | use Wikibase\DataModel\Statement\Statement; |
11 | 11 | use Wikibase\DataModel\Statement\StatementList; |
12 | 12 |
|
@@ -368,4 +368,71 @@ public function testNotEquals( Item $firstItem, Item $secondItem ) { |
368 | 368 | $this->assertFalse( $secondItem->equals( $firstItem ) ); |
369 | 369 | } |
370 | 370 |
|
| 371 | + public function cloneProvider() { |
| 372 | + $item = new Item( new ItemId( 'Q1' ) ); |
| 373 | + $item->setLabel( 'en', 'original' ); |
| 374 | + $item->getStatements()->addNewStatement( new PropertyNoValueSnak( 1 ) ); |
| 375 | + $item->getSiteLinkList()->addNewSiteLink( 'enwiki', 'Original' ); |
| 376 | + |
| 377 | + return array( |
| 378 | + 'copy' => array( $item, $item->copy() ), |
| 379 | + 'native clone' => array( $item, clone $item ), |
| 380 | + ); |
| 381 | + } |
| 382 | + |
| 383 | + /** |
| 384 | + * @dataProvider cloneProvider |
| 385 | + */ |
| 386 | + public function testCloneIsEqualButNotIdentical( Item $original, Item $clone ) { |
| 387 | + $this->assertNotSame( $original, $clone ); |
| 388 | + $this->assertTrue( $original->equals( $clone ) ); |
| 389 | + $this->assertSame( |
| 390 | + $original->getId(), |
| 391 | + $clone->getId(), |
| 392 | + 'id is immutable and must not be cloned' |
| 393 | + ); |
| 394 | + |
| 395 | + // The clone must not reference the same mutable objects |
| 396 | + $this->assertNotSame( $original->getFingerprint(), $clone->getFingerprint() ); |
| 397 | + $this->assertNotSame( $original->getStatements(), $clone->getStatements() ); |
| 398 | + $this->assertNotSame( |
| 399 | + $original->getStatements()->getFirstStatementWithGuid( null ), |
| 400 | + $clone->getStatements()->getFirstStatementWithGuid( null ) |
| 401 | + ); |
| 402 | + $this->assertNotSame( $original->getSiteLinkList(), $clone->getSiteLinkList() ); |
| 403 | + $this->assertSame( |
| 404 | + $original->getSiteLinkList()->getBySiteId( 'enwiki' ), |
| 405 | + $clone->getSiteLinkList()->getBySiteId( 'enwiki' ), |
| 406 | + 'SiteLink is immutable and must not be cloned' |
| 407 | + ); |
| 408 | + } |
| 409 | + |
| 410 | + /** |
| 411 | + * @dataProvider cloneProvider |
| 412 | + */ |
| 413 | + public function testOriginalDoesNotChangeWithClone( Item $original, Item $clone ) { |
| 414 | + $originalStatement = $original->getStatements()->getFirstStatementWithGuid( null ); |
| 415 | + $clonedStatement = $clone->getStatements()->getFirstStatementWithGuid( null ); |
| 416 | + |
| 417 | + $clone->setLabel( 'en', 'clone' ); |
| 418 | + $clone->setDescription( 'en', 'clone' ); |
| 419 | + $clone->setAliases( 'en', array( 'clone' ) ); |
| 420 | + $clonedStatement->setGuid( 'clone' ); |
| 421 | + $clonedStatement->setMainSnak( new PropertySomeValueSnak( 666 ) ); |
| 422 | + $clonedStatement->setRank( Statement::RANK_DEPRECATED ); |
| 423 | + $clonedStatement->getQualifiers()->addSnak( new PropertyNoValueSnak( 1 ) ); |
| 424 | + $clonedStatement->getReferences()->addNewReference( new PropertyNoValueSnak( 1 ) ); |
| 425 | + $clone->getSiteLinkList()->removeLinkWithSiteId( 'enwiki' ); |
| 426 | + |
| 427 | + $this->assertSame( 'original', $original->getFingerprint()->getLabel( 'en' )->getText() ); |
| 428 | + $this->assertFalse( $original->getFingerprint()->hasDescription( 'en' ) ); |
| 429 | + $this->assertFalse( $original->getFingerprint()->hasAliasGroup( 'en' ) ); |
| 430 | + $this->assertNull( $originalStatement->getGuid() ); |
| 431 | + $this->assertSame( 'novalue', $originalStatement->getMainSnak()->getType() ); |
| 432 | + $this->assertSame( Statement::RANK_NORMAL, $originalStatement->getRank() ); |
| 433 | + $this->assertTrue( $originalStatement->getQualifiers()->isEmpty() ); |
| 434 | + $this->assertTrue( $originalStatement->getReferences()->isEmpty() ); |
| 435 | + $this->assertFalse( $original->getSiteLinkList()->isEmpty() ); |
| 436 | + } |
| 437 | + |
371 | 438 | } |
0 commit comments