ILIAS  trunk Revision v13.0_alpha-62-g3b72d83f2e5
MigratedLanguageFileSyncPluralHelpersTest.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
22
24use PHPUnit\Framework\TestCase;
25
31{
33 {
34 $shipped = ['item [0]' => 'Eintrag', 'item [1]' => 'Einträge'];
35 $entries = ['item [0]' => 'Eintrag', 'item [1]' => 'Einträge NEU'];
36
37 $this->assertSame(['item' => 'Einträge NEU'], MigratedLanguageFileSync::collapsePluralForms($entries, $shipped));
38 }
39
45 {
46 $shipped = ['item [0]' => 'Eintrag', 'item [1]' => 'Einträge'];
47 $entries = ['item [1]' => 'Einträge NEU']; // form 0 not submitted at all
48
49 $this->assertSame(['item' => 'Einträge NEU'], MigratedLanguageFileSync::collapsePluralForms($entries, $shipped));
50 }
51
54 {
55 $shipped = ['before' => 'A', 'item [0]' => 'Eintrag', 'item [1]' => 'Einträge', 'after' => 'B'];
56
57 $this->assertSame(
58 ['before', 'item', 'after'],
59 array_keys(MigratedLanguageFileSync::collapsePluralForms($shipped, $shipped))
60 );
61 }
62
65 {
66 $shipped = ['item [0]' => 'Eintrag', 'item [1]' => 'Einträge'];
67 $entries = ['item [0]' => 'Eintrag', 'item [1]' => 'Einträge NEU', 'item [5]' => 'Geister-Form'];
68
69 $collapsed = MigratedLanguageFileSync::collapsePluralForms($entries, $shipped);
70
71 $this->assertSame(['item' => 'Einträge NEU'], $collapsed);
72 }
73
76 {
77 $shipped = ['item [0]' => 'Eintrag', 'item [1]' => 'Einträge'];
78 $entries = ['item' => 'Veraltet', 'item [0]' => 'Eintrag', 'item [1]' => 'Einträge NEU'];
79
80 $this->assertSame(['item' => 'Einträge NEU'], MigratedLanguageFileSync::collapsePluralForms($entries, $shipped));
81 }
82
84 {
85 $shipped = ['item [0]' => 'Eintrag', 'item [1]' => 'Einträge', 'plain' => 'X'];
86 $entries = ['plain' => 'Y', 'other' => 'Z'];
87
88 $this->assertSame(['plain' => 'Y', 'other' => 'Z'], MigratedLanguageFileSync::collapsePluralForms($entries, $shipped));
89 }
90
92 {
93 $shipped = ['plain' => 'X'];
94 $entries = ['plain' => 'Y', 'other [0]' => 'looks like a form but is not one'];
95
96 $this->assertSame($entries, MigratedLanguageFileSync::collapsePluralForms($entries, $shipped));
97 }
98
104 {
105 $shipped = ['item' => 'Eigener Wert', 'item [0]' => 'Form 0', 'item [1]' => 'Form 1'];
106
107 $this->assertSame($shipped, MigratedLanguageFileSync::collapsePluralForms($shipped, $shipped));
108 }
109
112 {
113 $shipped = ['item [0]' => 'jeden', 'item [1]' => 'dva', 'item [2]' => 'mnoho'];
114 $entries = ['item [0]' => 'jeden', 'item [1]' => 'dva', 'item [2]' => 'mnoho NEU'];
115
116 $this->assertSame(['item' => 'mnoho NEU'], MigratedLanguageFileSync::collapsePluralForms($entries, $shipped));
117 }
118
124 {
125 $shipped = ['item [0]' => 'jeden', 'item [1]' => 'dva', 'item [2]' => 'mnoho'];
126 $entries = ['item [0]' => 'jeden', 'item [1]' => 'dva', 'item [2]' => ''];
127
128 $this->assertSame(['item' => 'dva'], MigratedLanguageFileSync::collapsePluralForms($entries, $shipped));
129 }
130
136 {
137 $shipped = ['item [0]' => 'Eintrag', 'item [1]' => 'Einträge'];
138 $entries = ['item' => 'Alter DB-Wert'];
139
140 $this->assertSame(['item [1]' => 'Alter DB-Wert'], MigratedLanguageFileSync::mapLegacyPluralValues($entries, $shipped));
141 }
142
145 {
146 $shipped = ['item [0]' => 'jeden', 'item [1]' => 'dva', 'item [2]' => 'mnoho'];
147 $entries = ['item' => 'Alter DB-Wert'];
148
149 $this->assertSame(['item [2]' => 'Alter DB-Wert'], MigratedLanguageFileSync::mapLegacyPluralValues($entries, $shipped));
150 }
151
153 {
154 $shipped = ['item [0]' => 'Eintrag']; // nplurals=1
155 $entries = ['item' => 'Alter DB-Wert'];
156
157 $this->assertSame(['item [0]' => 'Alter DB-Wert'], MigratedLanguageFileSync::mapLegacyPluralValues($entries, $shipped));
158 }
159
162 {
163 $shipped = ['item [0]' => 'Eintrag', 'item [1]' => 'Einträge'];
164 $entries = ['item' => 'Alter DB-Wert', 'item [1]' => 'Neue Form 1'];
165
166 $this->assertSame(['item [1]' => 'Neue Form 1'], MigratedLanguageFileSync::mapLegacyPluralValues($entries, $shipped));
167 }
168
171 {
172 $shipped = ['item [0]' => 'Eintrag', 'item [1]' => 'Einträge'];
173 $entries = ['item' => 'Alter DB-Wert', 'item [0]' => 'Neue Form 0'];
174
175 $this->assertSame(
176 ['item [0]' => 'Neue Form 0', 'item [1]' => 'Alter DB-Wert'],
178 );
179 }
180
182 {
183 $shipped = ['item [0]' => 'Eintrag', 'item [1]' => 'Einträge'];
184 $entries = ['plain' => 'X', 'item [0]' => 'A', 'item [1]' => 'B'];
185
186 $this->assertSame($entries, MigratedLanguageFileSync::mapLegacyPluralValues($entries, $shipped));
187 }
188
190 public function testPreservesNonStringValueTypes(): void
191 {
192 $shipped = ['item [0]' => 'Eintrag', 'item [1]' => 'Einträge'];
193 $entries = ['item' => true];
194
195 $this->assertSame(['item [1]' => true], MigratedLanguageFileSync::mapLegacyPluralValues($entries, $shipped));
196 }
197
199 {
200 $shipped = ['item [0]' => 'Eintrag', 'item [1]' => 'Einträge'];
201
202 $this->assertSame('item', MigratedLanguageFileSync::pluralMessageOf('item [1]', $shipped));
203 }
204
206 {
207 $shipped = ['item [0]' => 'Eintrag', 'item [1]' => 'Einträge'];
208
209 $this->assertSame('item', MigratedLanguageFileSync::pluralMessageOf('item', $shipped));
210 }
211
213 {
214 $shipped = ['item [0]' => 'Eintrag', 'item [1]' => 'Einträge', 'plain' => 'X'];
215
216 $this->assertNull(MigratedLanguageFileSync::pluralMessageOf('plain', $shipped));
217 }
218
220 {
221 $shipped = ['plain [0]' => 'X']; // shipped as its own entry, not via other forms
222 $shipped['plain'] = 'irrelevant';
223
224 $this->assertNull(MigratedLanguageFileSync::pluralMessageOf('plain [0]', $shipped));
225 }
226
228 {
229 $this->assertNull(MigratedLanguageFileSync::pluralMessageOf('unknown [0]', []));
230 $this->assertNull(MigratedLanguageFileSync::pluralMessageOf('unknown', []));
231 }
232
238 {
239 $shipped = ['item [0]' => 'Eintrag', 'item [1]' => 'Einträge'];
240
241 $this->assertSame('item [1]', MigratedLanguageFileSync::defaultFormKeyOf('item', $shipped));
242 }
243
245 {
246 $shipped = ['item [0]' => 'jeden', 'item [1]' => 'dva', 'item [2]' => 'mnoho'];
247
248 $this->assertSame('item [2]', MigratedLanguageFileSync::defaultFormKeyOf('item', $shipped));
249 }
250
253 {
254 $shipped = ['item [0]' => 'Eintrag', 'item [1]' => 'Einträge'];
255
256 $this->assertNull(MigratedLanguageFileSync::defaultFormKeyOf('item [0]', $shipped));
257 $this->assertNull(MigratedLanguageFileSync::defaultFormKeyOf('item [1]', $shipped));
258 }
259
262 {
263 $shipped = ['item [0]' => 'Eintrag', 'item [1]' => 'Einträge', 'item_singular' => 'Ein Eintrag'];
264
265 $this->assertNull(MigratedLanguageFileSync::defaultFormKeyOf('item_singular', $shipped));
266 }
267
269 {
270 $this->assertNull(MigratedLanguageFileSync::defaultFormKeyOf('unknown', []));
271 }
272
275 {
276 $shipped = ['item' => 'Eigener Wert', 'item [0]' => 'Form 0', 'item [1]' => 'Form 1'];
277
278 $this->assertNull(MigratedLanguageFileSync::defaultFormKeyOf('item', $shipped));
279 }
280}
Reads the shipped .po of a migrated module and maintains its per-installation overlay: the ....
static pluralMessageOf(string $key, array $shipped_entries)
The identifier of the plural message of $shipped_entries (form keys included) $key belongs to,...
static mapLegacyPluralValues(array $entries, array $shipped_entries)
$entries with a plain value of the identifier of a plural message of $shipped_entries moved to the ke...
static defaultFormKeyOf(string $identifier, array $shipped_entries)
The key of the default form (the last, see PluralForms) of the plural message $identifier of $shipped...
static collapsePluralForms(array $entries, array $shipped_entries)
$entries (see the class docblock) as the database holds them: the forms of every plural message of $s...
Pure helpers folding a plural message's forms (keys via PluralFormKey) into one lng_data row and back...
testCollapsesToTheLastFormForAThreeFormLanguage()
Three forms (Czech-shaped): the identifier's value is the LAST form's, not msgstr[1]; see PluralForms...
testDefaultFormKeyOfMapsThePlainIdentifierToItsLastFormKey()
The plain identifier of a plural message (import line, "add new variable") maps to the key of its def...
testAFormMissingFromEntriesFallsBackToItsShippedValue()
A form missing from $entries counts with its shipped value, not as empty (a partial submission must n...
testCollapsesToTheClosestNonEmptyFormWhenTheLastFormIsEmpty()
An empty last form falls back to the closest non-empty form before it (PluralForms::defaultValueForCo...
testAPlainValueIsStillMappedWhenOnlyANonDefaultFormIsAlreadyPresent()
A present non-default form key does not stop the plain value from mapping to the absent default form ...
testPreservesNonStringValueTypes()
Values of any type round-trip: loadOverlay()/resolveMigratedModule() pass a boolean "is local change"...
testAPlainValueNextToFormsIsDroppedInFavourOfTheForms()
A plain value under the plural identifier loses to the form keys.
testDefaultFormKeyOfIsNullForAFormKeyItself()
A key that already is a form key is no plain identifier: null.
testDefaultFormKeyOfIsNullForAnIdentifierShippedBothAsItsOwnEntryAndWithFormKeys()
An identifier shipped as its own entry and with form keys is not mapped either (pluralMessageOf()'s g...
testAPlainValueOfAThreeFormLanguagesPluralIdentifierBecomesTheLastForm()
More than two forms: the plain value becomes the LAST form's key ("item [2]" for three forms).
testAnIdentifierShippedBothAsItsOwnEntryAndWithFormKeysIsNotTreatedAsPlural()
An identifier shipped as its own entry and with form keys (contradictory data) is not treated as plur...
testThePluralIdentifierIsPlacedAtThePositionOfItsFirstFormKey()
Entries keep the position of their identifier's first form key.
testAPlainValueOfAPluralIdentifierBecomesItsDefaultForm()
A plain value under a plural identifier (a local change from before the module had plurals,...
testAPlainValueIsDroppedWhenItsDefaultFormKeyIsAlreadyPresent()
An already present default form key wins; the plain value is dropped.