Completed
Push — master ( a9f673...d16089 )
by Jeroen De
02:36
created

ValuesFinderTest::objectAssociativeSort()   A

Complexity

Conditions 2
Paths 1

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 8
rs 9.4286
cc 2
eloc 5
nc 1
nop 1
1
<?php
2
3
namespace Wikibase\DataModel\Services\Tests\DataValue;
4
5
use DataValues\BooleanValue;
6
use DataValues\DataValue;
7
use DataValues\StringValue;
8
use Wikibase\DataModel\Entity\PropertyId;
9
use Wikibase\DataModel\Services\DataValue\ValuesFinder;
10
use Wikibase\DataModel\Services\Lookup\InMemoryDataTypeLookup;
11
use Wikibase\DataModel\Snak\PropertyNoValueSnak;
12
use Wikibase\DataModel\Snak\PropertySomeValueSnak;
13
use Wikibase\DataModel\Snak\PropertyValueSnak;
14
use Wikibase\DataModel\Snak\Snak;
15
16
/**
17
 * @covers Wikibase\DataModel\Services\DataValue\ValuesFinder
18
 *
19
 * @licence GNU GPL v2+
20
 * @author Bene* < [email protected] >
21
 */
22
class ValuesFinderTest extends \PHPUnit_Framework_TestCase {
23
24
	private static $propertyDataTypes = array(
25
		'P23' => 'string',
26
		'P42' => 'url',
27
		'P44' => 'boolean'
28
	);
29
30
	public function snaksProvider() {
31
		$argLists = array();
32
33
		$p23 = new PropertyId( 'p23' );
34
		$p42 = new PropertyId( 'p42' );
35
		$p44 = new PropertyId( 'p44' );
36
		$p404 = new PropertyId( 'P404' );
37
38
		$argLists['empty'] = array(
39
			array(),
40
			'url',
41
			array() );
42
43
		$argLists['PropertyNoValueSnak'] = array(
44
			array( new PropertyNoValueSnak( $p42 ) ),
45
			'url',
46
			array() );
47
48
		$argLists['PropertySomeValueSnak'] = array(
49
			array( new PropertySomeValueSnak( $p42 ) ),
50
			'url',
51
			array() );
52
53
		$argLists['PropertyValueSnak with string value and unknown data type'] = array(
54
			array( new PropertyValueSnak( $p404, new StringValue( 'not an url' ) ) ),
55
			'url',
56
			array() );
57
58
		$argLists['PropertyValueSnak with string value and wrong data type'] = array(
59
			array( new PropertyValueSnak( $p23, new StringValue( 'not an url' ) ) ),
60
			'url',
61
			array() );
62
63
		$argLists['PropertyValueSnak with string value and correct data type'] = array(
64
			array( new PropertyValueSnak( $p42, new StringValue( 'http://acme.com/test' ) ) ),
65
			'url',
66
			array( 'http://acme.com/test' ) );
67
68
		$argLists['PropertyValueSnak with boolean value'] = array(
69
			array( new PropertyValueSnak( $p42, new BooleanValue( true ) ) ),
70
			'url',
71
			array( true ) );
72
73
		$argLists['PropertyValueSnak with string values and correct data type'] = array(
74
			array( new PropertyValueSnak( $p42, new StringValue( 'http://acme.com/test' ) ),
75
					new PropertyValueSnak( $p42, new StringValue( 'http://foo.bar/' ) ) ),
76
			'url',
77
			array( 'http://acme.com/test', 'http://foo.bar/' ) );
78
79
		$argLists['PropertyValueSnak with boolean value and correct data type'] = array(
80
			array( new PropertyValueSnak( $p44, new BooleanValue( false ) ) ),
81
			'boolean',
82
			array( false ) );
83
84
		$argLists['PropertyValueSnak with boolean value and wrong data type'] = array(
85
			array( new PropertyValueSnak( $p44, new BooleanValue( false ) ) ),
86
			'url',
87
			array() );
88
89
		return $argLists;
90
	}
91
92
	/**
93
	 * @dataProvider snaksProvider
94
	 *
95
	 * @param Snak[] $snaks
96
	 * @param string $dataType
97
	 * @param string[] $expected
98
	 */
99
	public function testFindFromSnaks( array $snaks, $dataType, array $expected ) {
100
		$valuesFinder = $this->getValuesFinder();
101
102
		$actual = $valuesFinder->findFromSnaks( $snaks, $dataType );
103
104
		$actual = array_map( function( DataValue $dataValue ) {
105
			return $dataValue->getValue();
106
		}, $actual );
107
108
		$this->assertArrayEquals( $expected, $actual ); // assertArrayEquals doesn't take a message :(
109
	}
110
111
	private function getValuesFinder() {
112
		$dataTypeLookup = new InMemoryDataTypeLookup();
113
114
		foreach ( self::$propertyDataTypes as $propertyId => $dataType ) {
115
			$dataTypeLookup->setDataTypeForProperty( new PropertyId( $propertyId ), $dataType );
116
		}
117
118
		return new ValuesFinder( $dataTypeLookup );
119
	}
120
121
	/**
122
	 * Assert that two arrays are equal. By default this means that both arrays need to hold
123
	 * the same set of values. Using additional arguments, order and associated key can also
124
	 * be set as relevant.
125
	 *
126
	 * @param array $expected
127
	 * @param array $actual
128
	 * @param bool $ordered If the order of the values should match
129
	 * @param bool $named If the keys should match
130
	 */
131
	private function assertArrayEquals( array $expected, array $actual,
132
		$ordered = false, $named = false
133
	) {
134
		if ( !$ordered ) {
135
			$this->objectAssociativeSort( $expected );
136
			$this->objectAssociativeSort( $actual );
137
		}
138
139
		if ( !$named ) {
140
			$expected = array_values( $expected );
141
			$actual = array_values( $actual );
142
		}
143
144
		call_user_func_array(
145
			array( $this, 'assertEquals' ),
146
			array_merge( array( $expected, $actual ), array_slice( func_get_args(), 4 ) )
147
		);
148
	}
149
150
	/**
151
	 * Does an associative sort that works for objects.
152
	 *
153
	 * @param array $array
154
	 */
155
	private function objectAssociativeSort( array &$array ) {
156
		uasort(
157
			$array,
158
			function ( $a, $b ) {
159
				return serialize( $a ) > serialize( $b ) ? 1 : -1;
160
			}
161
		);
162
	}
163
164
}
165