Passed
Push — master ( d5f4f5...7ecb6b )
by Alaa
01:40
created

testAcquiresUniqueIdsForNonExistingTerms()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 16
rs 9.7333
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\InMemoryTermIdsStore;
7
8
/**
9
 * @covers \Wikibase\TermStore\MediaWiki\PackagePrivate\InMemoryTermIdsStore
10
 */
11
class InMemoryTermIdsStoreTest extends TestCase {
12
13
	public function testAcquiresUniqueIdsForNonExistingTerms() {
14
		$termsIdsAcquirer = new InMemoryTermIdsStore();
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 InMemoryTermIdsStore();
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 InMemoryTermIdsStore();
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 testResolveTermIds_returnsAcquiredTerms_butNotAllTerms() {
98
		$termIdsStore = new InMemoryTermIdsStore();
99
100
		$termIds1 = $termIdsStore->acquireTermIds( [
101
			'label' => [
102
				'en' => 'some label',
103
				'de' => 'eine Beschriftung',
104
			],
105
		] );
106
		$termIds2 = $termIdsStore->acquireTermIds( [
107
			'label' => [
108
				'de' => 'eine Beschriftung',
109
			],
110
			'alias' => [
111
				'de' => [ 'ein Alias', 'noch ein Alias' ],
112
			],
113
		] );
114
115
		$terms1 = $termIdsStore->resolveTermIds( $termIds1 );
116
		$terms2 = $termIdsStore->resolveTermIds( $termIds2 );
117
118
		$this->assertSame( [
119
			'label' => [
120
				'en' => [ 'some label' ],
121
				'de' => [ 'eine Beschriftung' ],
122
			],
123
		], $terms1 );
124
		$this->assertSame( [
125
			'label' => [
126
				'de' => [ 'eine Beschriftung' ],
127
			],
128
			'alias' => [
129
				'de' => [ 'ein Alias', 'noch ein Alias' ],
130
			],
131
		], $terms2 );
132
	}
133
134
	public function testCleanTerms_doesNotReuseIds() {
135
		$termIdsStore = new InMemoryTermIdsStore();
136
137
		$originalIds = $termIdsStore->acquireTermIds( [
138
			'label' => [
139
				'en' => 'the label',
140
				'de' => 'die Bezeichnung',
141
			],
142
			'alias' => [
143
				'en' => [ 'alias', 'another' ],
144
			],
145
			'description' => [ 'en' => 'the description' ],
146
		] );
147
148
		$termIdsStore->cleanTerms( $originalIds );
149
150
		$newIds = $termIdsStore->acquireTermIds( [
151
			'label' => [ 'en' => 'the label' ],
152
			'description' => [ 'en' => 'the description' ],
153
		] );
154
155
		// Assert that the lowest new id is higher than the highest original id
156
		$this->assertGreaterThan( max( $originalIds ), min( $newIds ) );
157
	}
158
159
	public function testCleanTerms_keepsOtherIds() {
160
		$termIdsStore = new InMemoryTermIdsStore();
161
162
		$acquiredIds = $termIdsStore->acquireTermIds( [
163
			'label' => [
164
				'en' => 'id 1',
165
				'de' => 'id 2',
166
			],
167
			'alias' => [
168
				'en' => [ 'id 3' ],
169
			],
170
			'description' => [ 'en' => 'id 4' ],
171
		] );
172
173
		$termIdsStore->cleanTerms( [ $acquiredIds[1], $acquiredIds[2] ] );
174
175
		$this->assertSame(
176
			[ $acquiredIds[0], $acquiredIds[3] ],
177
			$termIdsStore->acquireTermIds( [
178
				'label' => [ 'en' => 'id 1' ],
179
				'description' => [ 'en' => 'id 4' ],
180
			] )
181
		);
182
	}
183
184
}
185