summaryrefslogtreecommitdiff
blob: 99b71beb1f0a17622951fcfc3288121f2120dda7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
<?php
/**
 * @file
 * @license GPL-2.0-or-later
 */

use MediaWiki\Extension\Translate\MessageSync\MessageSourceChange;

/** @covers MediaWiki\Extension\Translate\MessageSync\MessageSourceChange */
class MessageSourceChangeTest extends MediaWikiUnitTestCase {
	/** @var MessageSourceChange */
	protected $change;

	/**
	 * Creates a new MessageSourceChange object before each test.
	 */
	protected function setUp(): void {
		parent::setUp();

		$this->change = new MessageSourceChange();
		$this->change->addAddition( 'en', 'added', 'content-added' );
		$this->change->addChange( 'en', 'changed', 'content-changed' );
		$this->change->addDeletion( 'en', 'deleted', 'content-deleted' );
		$this->change->addRename(
			'en',
			[
				'key' => 'renameAdded',
				'content' => 'added'
			],
			[
				'key' => 'renameDeleted',
				'content' => 'deleted'
			],
			0
		);

		$this->change->addAddition( 'en-gb', 'added', 'en-gb-content-added' );
	}

	public function testAddFindDelete() {
		$modificationType = null;

		$added = $this->change->findMessage( 'en', 'added', [ MessageSourceChange::ADDITION ] );
		$changed = $this->change->findMessage(
			'en', 'changed', [ MessageSourceChange::CHANGE ]
		);
		$deleted = $this->change->findMessage(
			'en', 'deleted', [ MessageSourceChange::DELETION ]
		);
		$rename = $this->change->findMessage(
			'en', 'renameDeleted', [ MessageSourceChange::RENAME ]
		);

		$this->assertArrayHasKey( 'key', $added, 'findMessage returns added message.' );
		$this->assertArrayHasKey( 'key', $changed, 'findMessage returns changed message.' );
		$this->assertArrayHasKey( 'key', $deleted, 'findMessage returns deleted message.' );
		$this->assertArrayHasKey( 'key', $rename, 'findMessage returns deleted rename message.' );

		$modificationAdded = $this->change->findMessage( 'en-gb', 'added', [
			MessageSourceChange::ADDITION,
			MessageSourceChange::CHANGE,
			MessageSourceChange::DELETION
		], $modificationType );
		$this->assertArrayHasKey(
			'key', $modificationAdded,
			'findMessage returns added message correctly when checking multiple types.'
		);
		$this->assertEquals( $modificationType, MessageSourceChange::ADDITION );

		$this->change->removeAdditions( 'en', [ 'added' ] );
		$this->change->removeChanges( 'en', [ 'changed' ] );
		$this->change->removeDeletions( 'en', [ 'deleted' ] );

		$added = $this->change->findMessage( 'en', 'added', [ MessageSourceChange::ADDITION ] );
		$changed = $this->change->findMessage(
			'en', 'changed', [ MessageSourceChange::CHANGE ]
		);
		$deleted = $this->change->findMessage(
			'en', 'deleted', [ MessageSourceChange::DELETION ]
		);

		$this->assertNull( $added, 'findMessage returns null for removed additions.' );
		$this->assertNull( $changed, 'findMessage returns null for removed changes.' );
		$this->assertNull( $deleted, 'findMessage returns null for removed deleted.' );
	}

	public function testBreakRename() {
		$added = $this->change->findMessage(
			'en', 'renameAdded', [ MessageSourceChange::ADDITION ]
		);
		$deleted = $this->change->findMessage(
			'en', 'renameDeleted', [ MessageSourceChange::DELETION ]
		);

		$this->assertNull(
			$added, 'renamed message is removed from additions.'
		);
		$this->assertNull(
			$deleted, 'renamed message is removed from deletions.'
		);

		$this->change->breakRename( 'en', 'renameAdded' );

		$added = $this->change->findMessage(
			'en', 'renameAdded', [ MessageSourceChange::ADDITION ]
		);
		$deleted = $this->change->findMessage(
			'en', 'renameDeleted', [ MessageSourceChange::DELETION ]
		);

		$this->assertArrayHasKey(
			'key', $added, 'broken rename message is added back to additions'
		);
		$this->assertArrayHasKey(
			'key', $deleted, 'broken rename message is added back to deletions'
		);
	}

	public function testPreviousState() {
		$this->change->addRename( 'en-gb', [
			'key' => 'renameAdded',
			'content' => 'added'
		],
		[
			'key' => 'renameDeleted',
			'content' => 'deleted'
		], 0 );

		$this->change->setRenameState( 'en-gb', 'renameDeleted', MessageSourceChange::NONE );

		$changed = $this->change->findMessage(
			'en-gb', 'renameDeleted', [ MessageSourceChange::CHANGE ]
		);
		$this->assertNull(
			$changed, 'findMessage returns null when searching changes for renamed message.'
		);

		$this->change->breakRename( 'en-gb', 'renameAdded' );

		$changed = $this->change->findMessage( 'en-gb', 'renameDeleted', [] );
		$added = $this->change->findMessage(
			'en-gb', 'renameAdded', [ MessageSourceChange::ADDITION ]
		);

		$this->assertNull(
			$changed, 'broken rename message with previous state as NONE is not found in changes'
		);
		$this->assertArrayHasKey(
			'key', $added,
			'broken rename message with previous state as additions is found ' .
			'in the additions list'
		);
	}

	public function testRemoveBasedOnType() {
		$this->change->addAddition( 'en', 'added2', 'content-added' );
		$this->change->removeBasedOnType( 'en', [ 'added', 'added2' ],
			MessageSourceChange::ADDITION );
		$this->change->removeBasedOnType( 'en', [ 'deleted' ], MessageSourceChange::DELETION );

		$this->expectException( InvalidArgumentException::class );
		$this->change->removeBasedOnType(
			'en', [ 'renameDeleted' ], MessageSourceChange::RENAME
		);

		$added = $this->change->findMessage( 'en', 'added', [ MessageSourceChange::ADDITION ] );
		$added2 = $this->change->findMessage( 'en', 'added2', [ MessageSourceChange::ADDITION ] );
		$deleted = $this->change->findMessage( 'en', 'deleted', [ MessageSourceChange::DELETION ] );
		$renames = $this->change->findMessage(
			'en', 'renameDeleted', [ MessageSourceChange::RENAME ]
		);

		$this->assertNull( $added, 'findMessage returns null for removed additions.' );
		$this->assertNull( $added2, 'findMessage returns null for removed changes.' );
		$this->assertNull( $deleted, 'findMessage returns null for removed deleted.' );
		$this->assertArrayHasKey(
			'key', $renames, 'removeBasedOnType does not remove rename messages.'
		);
	}

	public function testIsPreviousState() {
		$isAddedOrChanged = $this->change->isPreviousState( 'en', 'renameDeleted', [
			MessageSourceChange::ADDITION, MessageSourceChange::CHANGE
		] );

		$this->assertFalse(
			$isAddedOrChanged, 'previousState returns false for incorrect previous state'
		);

		$isDeleted = $this->change->isPreviousState( 'en', 'renameDeleted', [
			MessageSourceChange::DELETION
		] );

		$this->assertTrue( $isDeleted,
			'previousState returns true for correct previous state' );
	}

	public function testGetMatchedMessage() {
		$matchedMsg = $this->change->getMatchedMessage( 'en', 'renameAdded' );
		$this->assertEquals(
			'renameDeleted', $matchedMsg['key'], 'getMatchedMessage fetches the proper matched message'
		);

		$matchedMsg = $this->change->getMatchedMessage( 'en', 'renameDeleted' );
		$this->assertEquals(
			'renameAdded', $matchedMsg['key'], 'getMatchedMessage fetches the proper matched message'
		);
	}

	public function testHasOnly() {
		$enGbHasOnly = $this->change->hasOnly( 'en-gb', MessageSourceChange::ADDITION );
		$this->assertTrue( $enGbHasOnly, 'hasOnly ' );

		$enHasOnly = $this->change->hasOnly( 'en-gb', MessageSourceChange::RENAME );
		$this->assertFalse( $enHasOnly, '' );
	}

	public function testGetLanguages() {
		$changeLanguages = $this->change->getLanguages();
		$this->assertCount(
			2, $changeLanguages, 'getLanguages returns all languages that have modifications'
		);
	}
}