Passed
Push — removeDuplicates ( a8cc42...d91d26 )
by no
14:09 queued 10:59
created

HashArrayWithoutDuplicatesTest   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 155
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 13
lcom 1
cbo 5
dl 0
loc 155
rs 10
c 1
b 0
f 0

8 Methods

Rating   Name   Duplication   Size   Complexity  
A constructorProvider() 0 8 1
A getInstanceClass() 0 3 1
A elementInstancesProvider() 0 6 1
B testAddElement() 0 34 2
A testHasElement() 0 14 2
B testRemoveElement() 0 27 3
A testGetHash() 0 17 2
A testIndicesAreUpToDate() 0 15 1
1
<?php
2
3
namespace Wikibase\DataModel\Tests\HashArray;
4
5
use Hashable;
6
use Wikibase\DataModel\Fixtures\HashArrayElement;
7
use Wikibase\DataModel\Fixtures\MutableHashable;
8
use Wikibase\DataModel\HashArray;
9
use Wikibase\DataModel\Snak\PropertyNoValueSnak;
10
11
/**
12
 * @covers Wikibase\DataModel\HashArray
13
 *
14
 * @group Wikibase
15
 * @group WikibaseDataModel
16
 * @group HashArray
17
 *
18
 * @license GPL-2.0+
19
 * @author Jeroen De Dauw < [email protected] >
20
 */
21
class HashArrayWithoutDuplicatesTest extends HashArrayTest {
22
23
	public function constructorProvider() {
24
		$argLists = [];
25
26
		$argLists[] = [ HashArrayElement::getInstances() ];
27
		$argLists[] = [ array_merge( HashArrayElement::getInstances(), HashArrayElement::getInstances() ) ];
28
29
		return $argLists;
30
	}
31
32
	public function getInstanceClass() {
33
		return 'Wikibase\DataModel\Fixtures\HashArrayWithoutDuplicates';
34
	}
35
36
	public function elementInstancesProvider() {
37
		return $this->arrayWrap( array_merge(
38
			$this->arrayWrap( HashArrayElement::getInstances() ),
39
			[ HashArrayElement::getInstances() ]
40
		) );
41
	}
42
43
	/**
44
	 * @dataProvider instanceProvider
45
	 * @param HashArray $array
46
	 */
47
	public function testAddElement( HashArray $array ) {
48
		$elementCount = $array->count();
49
50
		$elements = $this->elementInstancesProvider();
51
		$element = array_shift( $elements );
52
		$element = $element[0][0];
53
54
		if ( !$array->hasElement( $element ) ) {
55
			++$elementCount;
56
		}
57
58
		$this->assertEquals(
59
			!$array->hasElement( $element ),
60
			$array->addElement( $element ),
61
			'Adding an element should only work if its not already there'
62
		);
63
64
		$this->assertEquals(
65
			$elementCount,
66
			$array->count(),
67
			'Element count should only increase if the element was not there yet'
68
		);
69
70
		$this->assertFalse(
71
			$array->addElement( $element ),
72
			'Adding an already present element should not work'
73
		);
74
75
		$this->assertEquals(
76
			$elementCount,
77
			$array->count(),
78
			'Element count should not increase if the element is already there'
79
		);
80
	}
81
82
	/**
83
	 * @dataProvider instanceProvider
84
	 * @param HashArray $array
85
	 */
86
	public function testHasElement( HashArray $array ) {
87
		/**
88
		 * @var Hashable $hashable
89
		 */
90
		foreach ( iterator_to_array( $array ) as $hashable ) {
91
			$this->assertTrue( $array->hasElement( $hashable ) );
92
			$this->assertTrue( $array->hasElementHash( $hashable->getHash() ) );
93
			$array->removeElement( $hashable );
94
			$this->assertFalse( $array->hasElement( $hashable ) );
95
			$this->assertFalse( $array->hasElementHash( $hashable->getHash() ) );
96
		}
97
98
		$this->assertTrue( true );
99
	}
100
101
	/**
102
	 * @dataProvider instanceProvider
103
	 * @param HashArray $array
104
	 */
105
	public function testRemoveElement( HashArray $array ) {
106
		$elementCount = $array->count();
107
108
		/**
109
		 * @var Hashable $element
110
		 */
111
		foreach ( iterator_to_array( $array ) as $element ) {
112
			$this->assertTrue( $array->hasElement( $element ) );
113
114
			if ( $elementCount % 2 === 0 ) {
115
				$array->removeElement( $element );
116
			}
117
			else {
118
				$array->removeByElementHash( $element->getHash() );
119
			}
120
121
			$this->assertFalse( $array->hasElement( $element ) );
122
			$this->assertEquals( --$elementCount, $array->count() );
123
		}
124
125
		$element = new PropertyNoValueSnak( 42 );
126
127
		$array->removeElement( $element );
128
		$array->removeByElementHash( $element->getHash() );
129
130
		$this->assertTrue( true );
131
	}
132
133
	/**
134
	 * @dataProvider instanceProvider
135
	 * @param HashArray $array
136
	 */
137
	public function testGetHash( HashArray $array ) {
138
		$hash = $array->getHash();
139
140
		$this->assertSame( $hash, $array->getHash() );
141
142
		$elements = $this->elementInstancesProvider();
143
		$element = array_shift( $elements );
144
		$element = $element[0][0];
145
146
		$array->addElement( $element );
147
148
		if ( $array->hasElement( $element ) ) {
149
			$this->assertSame( $hash, $array->getHash() );
150
		} else {
151
			$this->assertNotSame( $hash, $array->getHash() );
152
		}
153
	}
154
155
	/**
156
	 * @dataProvider instanceProvider
157
	 * @param HashArray $array
158
	 */
159
	public function testIndicesAreUpToDate( HashArray $array ) {
160
		$this->assertInternalType( 'boolean', $array->indicesAreUpToDate() );
161
162
		$mutable = new MutableHashable();
163
164
		$array->addElement( $mutable );
165
166
		$mutable->text = '~[,,_,,]:3';
167
168
		$this->assertFalse( $array->indicesAreUpToDate() );
169
170
		$array->rebuildIndices();
171
172
		$this->assertTrue( $array->indicesAreUpToDate() );
173
	}
174
175
}
176