SnakSerializationRoundtripTest   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 78
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 14

Importance

Changes 0
Metric Value
wmc 6
lcom 1
cbo 14
dl 0
loc 78
rs 10
c 0
b 0
f 0

6 Methods

Rating   Name   Duplication   Size   Complexity  
A getSnakSerializer() 0 4 1
A getSnakDeserializer() 0 7 1
A testSnakSerializationRoundtrips() 0 11 1
A snakProvider() 0 13 1
A testUnDeserializableValueToStringValueRoundtrip() 0 13 1
A testStringValueToUnDeserializableValueRoundtrip() 0 18 1
1
<?php
2
3
namespace Tests\Wikibase\DataModel;
4
5
use DataValues\Deserializers\DataValueDeserializer;
6
use DataValues\Serializers\DataValueSerializer;
7
use DataValues\StringValue;
8
use DataValues\UnDeserializableValue;
9
use PHPUnit\Framework\TestCase;
10
use Wikibase\DataModel\DeserializerFactory;
11
use Wikibase\DataModel\Entity\BasicEntityIdParser;
12
use Wikibase\DataModel\SerializerFactory;
13
use Wikibase\DataModel\Snak\PropertyNoValueSnak;
14
use Wikibase\DataModel\Snak\PropertySomeValueSnak;
15
use Wikibase\DataModel\Snak\PropertyValueSnak;
16
use Wikibase\DataModel\Snak\Snak;
17
18
/**
19
 * @license GPL-2.0-or-later
20
 * @author Jeroen De Dauw < [email protected] >
21
 * @author Thomas Pellissier Tanon
22
 * @author Thiemo Kreuz
23
 */
24
class SnakSerializationRoundtripTest extends TestCase {
25
26
	private function getSnakSerializer() {
27
		$factory = new SerializerFactory( new DataValueSerializer() );
28
		return $factory->newSnakSerializer();
29
	}
30
31
	private function getSnakDeserializer( array $dataValueClasses = [] ) {
32
		$factory = new DeserializerFactory(
33
			new DataValueDeserializer( $dataValueClasses ),
34
			new BasicEntityIdParser()
35
		);
36
		return $factory->newSnakDeserializer();
37
	}
38
39
	/**
40
	 * @dataProvider snakProvider
41
	 */
42
	public function testSnakSerializationRoundtrips( Snak $snak ) {
43
		$serializer = $this->getSnakSerializer();
44
		$deserializer = $this->getSnakDeserializer( [
45
			'string' => StringValue::class,
46
		] );
47
48
		$serialization = $serializer->serialize( $snak );
49
		$newSnak = $deserializer->deserialize( $serialization );
50
51
		$this->assertEquals( $snak, $newSnak );
52
	}
53
54
	public function snakProvider() {
55
		return [
56
			[
57
				new PropertyNoValueSnak( 42 ),
58
			],
59
			[
60
				new PropertySomeValueSnak( 42 ),
61
			],
62
			[
63
				new PropertyValueSnak( 42, new StringValue( 'hax' ) ),
64
			],
65
		];
66
	}
67
68
	public function testUnDeserializableValueToStringValueRoundtrip() {
69
		$serializer = $this->getSnakSerializer();
70
		$deserializer = $this->getSnakDeserializer( [
71
			'string' => StringValue::class,
72
		] );
73
74
		$badSnak = new PropertyValueSnak( 42, new UnDeserializableValue( 'Yay', 'string', '' ) );
75
		$serialization = $serializer->serialize( $badSnak );
76
		$newSnak = $deserializer->deserialize( $serialization );
77
78
		$goodSnak = new PropertyValueSnak( 42, new StringValue( 'Yay' ) );
79
		$this->assertEquals( $goodSnak, $newSnak );
80
	}
81
82
	public function testStringValueToUnDeserializableValueRoundtrip() {
83
		$serializer = $this->getSnakSerializer();
84
		$deserializer = $this->getSnakDeserializer();
85
86
		$goodSnak = new PropertyValueSnak( 42, new StringValue( 'Yay' ) );
87
		$serialization = $serializer->serialize( $goodSnak );
88
		$newSnak = $deserializer->deserialize( $serialization );
89
90
		/** @var PropertyValueSnak $newSnak */
91
		$this->assertInstanceOf( PropertyValueSnak::class, $newSnak );
92
		$this->assertSame( 'P42', $newSnak->getPropertyId()->getSerialization() );
93
94
		/** @var UnDeserializableValue $newValue */
95
		$newValue = $newSnak->getDataValue();
96
		$this->assertInstanceOf( UnDeserializableValue::class, $newValue );
97
		$this->assertSame( 'Yay', $newValue->getValue() );
98
		$this->assertSame( 'string', $newValue->getTargetType() );
99
	}
100
101
}
102