|
3 | 3 | namespace Wikibase\DataModel\Tests\Snak; |
4 | 4 |
|
5 | 5 | use DataValues\StringValue; |
| 6 | +use Hashable; |
6 | 7 | use InvalidArgumentException; |
7 | 8 | use Wikibase\DataModel\Entity\PropertyId; |
8 | 9 | use Wikibase\DataModel\Snak\PropertyNoValueSnak; |
@@ -293,4 +294,51 @@ public function testOrderByProperty( SnakList $snakList, SnakList $expected, arr |
293 | 294 | } |
294 | 295 | } |
295 | 296 |
|
| 297 | + public function testHashableInterface() { |
| 298 | + $this->assertInstanceOf( Hashable::class, new SnakList() ); |
| 299 | + } |
| 300 | + |
| 301 | + public function testGetHash() { |
| 302 | + $snakList = new SnakList( [ new PropertyNoValueSnak( 1 ) ] ); |
| 303 | + $hash = $snakList->getHash(); |
| 304 | + |
| 305 | + $this->assertInternalType( 'string', $hash, 'must be a string' ); |
| 306 | + $this->assertNotSame( '', $hash, 'must not be empty' ); |
| 307 | + $this->assertSame( $hash, $snakList->getHash(), 'second call must return the same hash' ); |
| 308 | + |
| 309 | + $otherList = new SnakList( [ new PropertyNoValueSnak( 2 ) ] ); |
| 310 | + $this->assertNotSame( $hash, $otherList->getHash() ); |
| 311 | + } |
| 312 | + |
| 313 | + /** |
| 314 | + * This integration test (relies on SnakObject::getHash) is supposed to break whenever the hash |
| 315 | + * calculation changes. |
| 316 | + */ |
| 317 | + public function testHashStability() { |
| 318 | + $snakList = new SnakList(); |
| 319 | + $this->assertSame( 'da39a3ee5e6b4b0d3255bfef95601890afd80709', $snakList->getHash() ); |
| 320 | + |
| 321 | + $snakList = new SnakList( [ new PropertyNoValueSnak( 1 ) ] ); |
| 322 | + $this->assertSame( '4327ac5109aaf437ccce05580c563a5857d96c82', $snakList->getHash() ); |
| 323 | + } |
| 324 | + |
| 325 | + /** |
| 326 | + * @dataProvider provideEqualSnakLists |
| 327 | + */ |
| 328 | + public function testGivenEqualSnakLists_getHashIsTheSame( SnakList $self, SnakList $other ) { |
| 329 | + $this->assertSame( $self->getHash(), $other->getHash() ); |
| 330 | + } |
| 331 | + |
| 332 | + public function provideEqualSnakLists() { |
| 333 | + $empty = new SnakList(); |
| 334 | + $oneSnak = new SnakList( [ new PropertyNoValueSnak( 1 ) ] ); |
| 335 | + |
| 336 | + return [ |
| 337 | + 'same empty object' => [ $empty, $empty ], |
| 338 | + 'same non-empty object' => [ $oneSnak, $oneSnak ], |
| 339 | + 'equal empty objects' => [ $empty, new SnakList() ], |
| 340 | + 'equal non-empty objects' => [ $oneSnak, new SnakList( [ new PropertyNoValueSnak( 1 ) ] ) ], |
| 341 | + ]; |
| 342 | + } |
| 343 | + |
296 | 344 | } |
0 commit comments