Passed
Push — master ( d8de29...20c7ec )
by Jeroen De
36s
created

testCleanTerms_completelyCleansArray()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 21
rs 9.584
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
namespace Wikibase\TermStore\MediaWiki\Tests\Unit\PackagePrivate;
4
5
use PHPUnit\Framework\TestCase;
6
use Wikibase\TermStore\MediaWiki\PackagePrivate\InMemoryTermIdsAcquirer;
7
8
/**
9
 * @covers \Wikibase\TermStore\MediaWiki\PackagePrivate\InMemoryTermIdsAcquirer
10
 */
11
class InMemoryTermIdsAcquirerTest extends TestCase {
12
13
	public function testAcquiresUniqueIdsForNonExistingTerms() {
14
		$termsIdsAcquirer = new InMemoryTermIdsAcquirer();
15
16
		$ids = $termsIdsAcquirer->acquireTermIds( [
17
			'label' => [
18
				'en' => 'some label',
19
				'de' => 'another label',
20
			],
21
			'alias' => [
22
				'en' => [ 'alias', 'another alias' ],
23
				'de' => 'de alias'
24
			]
25
		] );
26
27
		$this->assertNoDuplicates( $ids );
28
	}
29
30
	public function testReusesIdsOfExistingTerms() {
31
		$termsIdsAcquirer = new InMemoryTermIdsAcquirer();
32
33
		$previouslyAcquiredIds = $termsIdsAcquirer->acquireTermIds( [
34
			'label' => [
35
				'en' => 'some label',
36
				'de' => 'another label',
37
			],
38
			'alias' => [
39
				'en' => [ 'alias', 'another alias' ],
40
				'de' => 'de alias'
41
			]
42
		] );
43
44
		$newlyAcquiredIds = $termsIdsAcquirer->acquireTermIds( [
45
			'label' => [
46
				'en' => 'some label',
47
				'de' => 'another label',
48
			],
49
			'alias' => [
50
				'en' => [ 'alias', 'another alias' ],
51
				'de' => 'de alias'
52
			]
53
		] );
54
55
		$this->assertEquals(
56
			$previouslyAcquiredIds,
57
			$newlyAcquiredIds
58
		);
59
	}
60
61
	public function testAcquiresAndReusesIdsForNewAndExistingTerms() {
62
		$termsIdsAcquirer = new InMemoryTermIdsAcquirer();
63
64
		$previouslyAcquiredIds = $termsIdsAcquirer->acquireTermIds( [
65
			'label' => [
66
				'en' => 'some label',
67
				'de' => 'another label',
68
			]
69
		] );
70
71
		$newlyAcquiredIds = $termsIdsAcquirer->acquireTermIds( [
72
			'label' => [
73
				'en' => 'some label',
74
				'de' => 'another label',
75
			],
76
			'alias' => [
77
				'en' => [ 'alias', 'another alias' ],
78
				'de' => 'de alias'
79
			]
80
		] );
81
82
		$this->assertNoDuplicates( $newlyAcquiredIds );
83
84
		$this->assertEquals(
85
			$previouslyAcquiredIds,
86
			array_intersect( $previouslyAcquiredIds, $newlyAcquiredIds )
87
		);
88
	}
89
90
	private function assertNoDuplicates( $ids ) {
91
		$this->assertEquals(
92
			count( $ids ),
93
			count( array_unique( $ids ) )
94
		);
95
	}
96
97
	public function testCleanTerms_doesNotReuseIds() {
98
		$termIdsAcquirer = new InMemoryTermIdsAcquirer();
99
100
		$originalIds = $termIdsAcquirer->acquireTermIds( [
101
			'label' => [
102
				'en' => 'the label',
103
				'de' => 'die Bezeichnung',
104
			],
105
			'alias' => [
106
				'en' => [ 'alias', 'another' ],
107
			],
108
			'description' => [ 'en' => 'the description' ],
109
		] );
110
111
		$termIdsAcquirer->cleanTerms( $originalIds );
112
113
		$newIds = $termIdsAcquirer->acquireTermIds( [
114
			'label' => [ 'en' => 'the label' ],
115
			'description' => [ 'en' => 'the description' ],
116
		] );
117
118
		// Assert that the lowest new id is higher than the highest original id
119
		$this->assertGreaterThan( max( $originalIds ), min( $newIds ) );
120
	}
121
122
	public function testHasTerms_returnsFalseAfterCleaningTerms() {
123
		$termIdsAcquirer = new InMemoryTermIdsAcquirer();
124
125
		$ids = $termIdsAcquirer->acquireTermIds( [
126
			'label' => [
127
				'en' => 'the label',
128
				'de' => 'die Bezeichnung',
129
			],
130
			'alias' => [
131
				'en' => [ 'alias', 'another' ],
132
			],
133
			'description' => [ 'en' => 'the description' ],
134
		] );
135
136
		$termIdsAcquirer->cleanTerms( $ids );
137
138
		$this->assertFalse( $termIdsAcquirer->hasTerms() );
139
	}
140
141
	public function testHasTerms_returnsTrueAfterAcquiringTermIds() {
142
		$termIdsAcquirer = new InMemoryTermIdsAcquirer();
143
144
		$ids = $termIdsAcquirer->acquireTermIds( [
0 ignored issues
show
Unused Code introduced by
$ids is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
145
			'label' => [
146
				'en' => 'the label',
147
				'de' => 'die Bezeichnung',
148
			],
149
			'alias' => [
150
				'en' => [ 'alias', 'another' ],
151
			],
152
			'description' => [ 'en' => 'the description' ],
153
		] );
154
155
		$this->assertTrue( $termIdsAcquirer->hasTerms() );
156
	}
157
158
	public function testCleanTerms_keepsOtherIds() {
159
		$termIdsAcquirer = new InMemoryTermIdsAcquirer();
160
161
		$acquiredIds = $termIdsAcquirer->acquireTermIds( [
162
			'label' => [
163
				'en' => 'id 1',
164
				'de' => 'id 2',
165
			],
166
			'alias' => [
167
				'en' => [ 'id 3' ],
168
			],
169
			'description' => [ 'en' => 'id 4' ],
170
		] );
171
172
		$termIdsAcquirer->cleanTerms( [ $acquiredIds[1], $acquiredIds[2] ] );
173
174
		$this->assertSame(
175
			[ $acquiredIds[0], $acquiredIds[3] ],
176
			$termIdsAcquirer->acquireTermIds( [
177
				'label' => [ 'en' => 'id 1' ],
178
				'description' => [ 'en' => 'id 4' ],
179
			] )
180
		);
181
	}
182
183
}
184