Completed
Push — master ( 7247aa...c0676d )
by
unknown
03:08
created

StatementListPatcherTest::statementOrderProvider()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 110
Code Lines 82

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 1 Features 0
Metric Value
c 1
b 1
f 0
dl 0
loc 110
rs 8.2857
cc 1
eloc 82
nc 1
nop 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace Wikibase\DataModel\Services\Tests\Diff\Internal;
4
5
use DataValues\StringValue;
6
use Diff\DiffOp\Diff\Diff;
7
use Diff\DiffOp\DiffOpAdd;
8
use Diff\DiffOp\DiffOpChange;
9
use Diff\DiffOp\DiffOpRemove;
10
use Wikibase\DataModel\Services\Diff\Internal\StatementListPatcher;
11
use Wikibase\DataModel\Snak\PropertyNoValueSnak;
12
use Wikibase\DataModel\Snak\PropertySomeValueSnak;
13
use Wikibase\DataModel\Snak\PropertyValueSnak;
14
use Wikibase\DataModel\Statement\Statement;
15
use Wikibase\DataModel\Statement\StatementList;
16
17
/**
18
 * @covers Wikibase\DataModel\Services\Diff\Internal\StatementListPatcher
19
 *
20
 * @license GPL-2.0+
21
 * @author Jeroen De Dauw < [email protected] >
22
 * @author Thiemo Mättig
23
 */
24
class StatementListPatcherTest extends \PHPUnit_Framework_TestCase {
25
26
	public function patchStatementListProvider() {
27
		$statement1 = new Statement( new PropertyNoValueSnak( 1 ) );
28
		$statement2 = new Statement( new PropertyNoValueSnak( 2 ) );
29
30
		return array(
31
			// Empty diffs
32
			array(
33
				new StatementList(),
34
				new Diff(),
35
				new StatementList()
36
			),
37
			array(
38
				new StatementList( $statement1 ),
39
				new Diff(),
40
				new StatementList( $statement1 )
41
			),
42
43
			// Add operations
44
			array(
45
				new StatementList(),
46
				new Diff( array( new DiffOpAdd( $statement1 ) ), true ),
47
				new StatementList( $statement1 )
48
			),
49
			array(
50
				new StatementList(),
51
				new Diff( array( new DiffOpAdd( $statement1 ) ), false ),
52
				new StatementList( $statement1 )
53
			),
54
			array(
55
				new StatementList(),
56
				new Diff( array( new DiffOpAdd( $statement1 ) ) ),
57
				new StatementList( $statement1 )
58
			),
59
60
			// Remove operations
61
			array(
62
				new StatementList( $statement1 ),
63
				new Diff( array( new DiffOpRemove( $statement1 ) ), true ),
64
				new StatementList()
65
			),
66
			array(
67
				new StatementList( $statement1 ),
68
				new Diff( array( new DiffOpRemove( $statement1 ) ), false ),
69
				new StatementList()
70
			),
71
			array(
72
				new StatementList( $statement1 ),
73
				new Diff( array( new DiffOpRemove( $statement1 ) ) ),
74
				new StatementList()
75
			),
76
77
			// Mixed operations
78
			array(
79
				new StatementList( $statement1 ),
80
				new Diff( array(
81
					new DiffOpRemove( $statement1 ),
82
					new DiffOpAdd( $statement2 ),
83
				) ),
84
				new StatementList( $statement2 )
85
			),
86
			array(
87
				new StatementList( $statement1 ),
88
				new Diff( array(
89
					new DiffOpChange( $statement1, $statement2 ),
90
				) ),
91
				new StatementList( $statement2 )
92
			),
93
		);
94
	}
95
96
	/**
97
	 * @dataProvider patchStatementListProvider
98
	 */
99
	public function testPatchStatementList(
100
		StatementList $statements,
101
		Diff $patch,
102
		StatementList $expected
103
	) {
104
		$patcher = new StatementListPatcher();
105
		$patcher->patchStatementList( $statements, $patch );
106
		$this->assertEquals( $expected, $statements );
107
	}
108
109
	/**
110
	 * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
111
	 */
112
	public function statementOrderProvider() {
113
		$statement1 = new Statement( new PropertyNoValueSnak( 1 ), null, null, 's1' );
114
		$statement2 = new Statement( new PropertyNoValueSnak( 2 ), null, null, 's2' );
115
		$statement3 = new Statement( new PropertyNoValueSnak( 3 ), null, null, 's3' );
116
117
		return array(
118
			'Simple associative add' => array(
119
				new StatementList(),
120
				new Diff( array(
121
					's1' => new DiffOpAdd( $statement1 ),
122
				), true ),
123
				array( 's1' )
124
			),
125
			'Simple non-associative add' => array(
126
				new StatementList(),
127
				new Diff( array(
128
					's1' => new DiffOpAdd( $statement1 ),
129
				), false ),
130
				array( 's1' )
131
			),
132
			'Simple associative remove' => array(
133
				new StatementList( $statement1 ),
134
				new Diff( array(
135
					's1' => new DiffOpRemove( $statement1 ),
136
				), true ),
137
				array()
138
			),
139
			'Simple non-associative remove' => array(
140
				new StatementList( $statement1 ),
141
				new Diff( array(
142
					's1' => new DiffOpRemove( $statement1 ),
143
				), false ),
144
				array()
145
			),
146
147
			// Change operations
148
			'Remove and add' => array(
149
				new StatementList( $statement1 ),
150
				new Diff( array(
151
					's1' => new DiffOpRemove( $statement1 ),
152
					's2' => new DiffOpAdd( $statement2 ),
153
				) ),
154
				array( 's2' )
155
			),
156
			'Add and remove' => array(
157
				new StatementList( $statement1 ),
158
				new Diff( array(
159
					's2' => new DiffOpAdd( $statement2 ),
160
					's1' => new DiffOpRemove( $statement1 ),
161
				) ),
162
				array( 's2' )
163
			),
164
			'Simple associative replace' => array(
165
				new StatementList( $statement1 ),
166
				new Diff( array(
167
					's1' => new DiffOpChange( $statement1, $statement2 ),
168
				), true ),
169
				array( 's2' )
170
			),
171
			'Simple non-associative replace' => array(
172
				new StatementList( $statement1 ),
173
				new Diff( array(
174
					's1' => new DiffOpChange( $statement1, $statement2 ),
175
				), false ),
176
				array( 's2' )
177
			),
178
			'Replacing first element retains order' => array(
179
				new StatementList( $statement1, $statement2 ),
180
				new Diff( array(
181
					's1' => new DiffOpChange( $statement1, $statement3 ),
182
				) ),
183
				array( 's3', 's2' )
184
			),
185
			'Replacing last element retains order' => array(
186
				new StatementList( $statement1, $statement2 ),
187
				new Diff( array(
188
					's2' => new DiffOpChange( $statement2, $statement3 ),
189
				) ),
190
				array( 's1', 's3' )
191
			),
192
193
			// No-ops
194
			'Empty diff' => array(
195
				new StatementList( $statement1 ),
196
				new Diff(),
197
				array( 's1' )
198
			),
199
			'Adding existing element is no-op' => array(
200
				new StatementList( $statement1 ),
201
				new Diff( array(
202
					's1' => new DiffOpAdd( $statement1 ),
203
				) ),
204
				array( 's1' )
205
			),
206
			'Removing non-existing element is no-op' => array(
207
				new StatementList( $statement1 ),
208
				new Diff( array(
209
					's2' => new DiffOpRemove( $statement2 ),
210
				) ),
211
				array( 's1' )
212
			),
213
			'Replacing non-existing element is no-op' => array(
214
				new StatementList( $statement1 ),
215
				new Diff( array(
216
					's2' => new DiffOpChange( $statement2, $statement3 ),
217
				) ),
218
				array( 's1' )
219
			),
220
		);
221
	}
222
223
	/**
224
	 * @dataProvider statementOrderProvider
225
	 */
226
	public function testStatementOrder( StatementList $statements, Diff $patch, array $expectedGuids ) {
227
		$patcher = new StatementListPatcher();
228
		$patchedStatements = $patcher->getPatchedStatementList( $statements, $patch );
0 ignored issues
show
Deprecated Code introduced by
The method Wikibase\DataModel\Servi...tPatchedStatementList() has been deprecated with message: since 3.6, use patchStatementList instead

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
229
230
		$guids = array();
231
		foreach ( $patchedStatements->toArray() as $statement ) {
232
			$guids[] = $statement->getGuid();
233
		}
234
		$this->assertSame( $expectedGuids, $guids );
235
	}
236
237
	public function testGivenEmptyDiff_listIsReturnedAsIs() {
238
		$statements = new StatementList();
239
240
		$this->assertListResultsFromPatch( $statements, $statements, new Diff() );
241
	}
242
243
	private function assertListResultsFromPatch( StatementList $expected, StatementList $original, Diff $patch ) {
244
		$patcher = new StatementListPatcher();
245
		$clone = clone $original;
246
		$this->assertEquals( $expected, $patcher->getPatchedStatementList( $original, $patch ) );
0 ignored issues
show
Deprecated Code introduced by
The method Wikibase\DataModel\Servi...tPatchedStatementList() has been deprecated with message: since 3.6, use patchStatementList instead

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
247
		$this->assertEquals( $clone, $original, 'original must not change' );
248
	}
249
250
	public function testFoo() {
251
		$statement0 = new Statement( new PropertyNoValueSnak( 42 ) );
252
		$statement0->setGuid( 's0' );
253
254
		$statement1 = new Statement( new PropertySomeValueSnak( 42 ) );
255
		$statement1->setGuid( 's1' );
256
257
		$statement2 = new Statement( new PropertyValueSnak( 42, new StringValue( 'ohi' ) ) );
258
		$statement2->setGuid( 's2' );
259
260
		$statement3 = new Statement( new PropertyNoValueSnak( 1 ) );
261
		$statement3->setGuid( 's3' );
262
263
		$patch = new Diff( array(
264
			's0' => new DiffOpRemove( $statement0 ),
265
			's2' => new DiffOpAdd( $statement2 ),
266
			's3' => new DiffOpAdd( $statement3 )
267
		) );
268
269
		$source = new StatementList();
270
		$source->addStatement( $statement0 );
271
		$source->addStatement( $statement1 );
272
273
		$expected = new StatementList();
274
		$expected->addStatement( $statement1 );
275
		$expected->addStatement( $statement2 );
276
		$expected->addStatement( $statement3 );
277
278
		$this->assertListResultsFromPatch( $expected, $source, $patch );
279
	}
280
281
}
282