Completed
Push — master ( 6a08aa...2252e8 )
by William
03:47
created

LoaderTest::translatorData()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 38
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 25
dl 0
loc 38
c 0
b 0
f 0
rs 9.52
cc 1
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace PhpMyAdmin\MoTranslator\Tests;
6
7
use PhpMyAdmin\MoTranslator\Loader;
8
use PHPUnit\Framework\TestCase;
9
use function getenv;
10
use function putenv;
11
12
/**
13
 * Test for mo loading.
14
 */
15
class LoaderTest extends TestCase
16
{
17
    /**
18
     * @param mixed $locale
19
     * @param mixed $expected
20
     *
21
     * @dataProvider localeList
22
     */
23
    public function testListLocales($locale, $expected): void
24
    {
25
        $this->assertEquals(
26
            $expected,
27
            Loader::listLocales($locale)
28
        );
29
    }
30
31
    public function localeList(): array
32
    {
33
        return [
34
            [
35
                'cs_CZ',
36
                [
37
                    'cs_CZ',
38
                    'cs',
39
                ],
40
            ],
41
            [
42
                'sr_CS.UTF-8@latin',
43
                [
44
                    'sr_CS.UTF-8@latin',
45
                    'sr_CS@latin',
46
                    'sr@latin',
47
                    'sr_CS.UTF-8',
48
                    'sr_CS',
49
                    'sr',
50
                ],
51
            ],
52
            // For a locale containing country code, we prefer
53
            // full locale name, but if that's not found, fall back
54
            // to the language only locale name.
55
            [
56
                'sr_RS',
57
                [
58
                    'sr_RS',
59
                    'sr',
60
                ],
61
            ],
62
            // If language code is used, it's the only thing returned.
63
            [
64
                'sr',
65
                ['sr'],
66
            ],
67
            // There is support for language and charset only.
68
            [
69
                'sr.UTF-8',
70
                [
71
                    'sr.UTF-8',
72
                    'sr',
73
                ],
74
            ],
75
76
            // It can also split out character set from the full locale name.
77
            [
78
                'sr_RS.UTF-8',
79
                [
80
                    'sr_RS.UTF-8',
81
                    'sr_RS',
82
                    'sr',
83
                ],
84
            ],
85
86
            // There is support for @modifier in locale names as well.
87
            [
88
                'sr_RS.UTF-8@latin',
89
                [
90
                    'sr_RS.UTF-8@latin',
91
                    'sr_RS@latin',
92
                    'sr@latin',
93
                    'sr_RS.UTF-8',
94
                    'sr_RS',
95
                    'sr',
96
                ],
97
            ],
98
            [
99
                'sr.UTF-8@latin',
100
                [
101
                    'sr.UTF-8@latin',
102
                    'sr@latin',
103
                    'sr.UTF-8',
104
                    'sr',
105
                ],
106
            ],
107
108
            // We can pass in only language and modifier.
109
            [
110
                'sr@latin',
111
                [
112
                    'sr@latin',
113
                    'sr',
114
                ],
115
            ],
116
117
            // If locale name is not following the regular POSIX pattern,
118
            // it's used verbatim.
119
            [
120
                'something',
121
                ['something'],
122
            ],
123
124
            // Passing in an empty string returns an empty array.
125
            [
126
                '',
127
                [],
128
            ],
129
        ];
130
    }
131
132
    private function getLoader(string $domain, string $locale): Loader
133
    {
134
        $loader = new Loader();
135
        $loader->setlocale($locale);
136
        $loader->textdomain($domain);
137
        $loader->bindtextdomain($domain, __DIR__ . '/data/locale/');
138
139
        return $loader;
140
    }
141
142
    public function testLocaleChange(): void
143
    {
144
        $loader = new Loader();
145
        $loader->setlocale('cs');
146
        $loader->textdomain('phpmyadmin');
147
        $loader->bindtextdomain('phpmyadmin', __DIR__ . '/data/locale/');
148
        $translator = $loader->getTranslator('phpmyadmin');
149
        $this->assertEquals('Typ', $translator->gettext('Type'));
150
        $loader->setlocale('be_BY');
151
        $translator = $loader->getTranslator('phpmyadmin');
152
        $this->assertEquals('Тып', $translator->gettext('Type'));
153
    }
154
155
    /**
156
     * @param mixed $domain
157
     * @param mixed $locale
158
     * @param mixed $otherdomain
159
     * @param mixed $expected
160
     *
161
     * @dataProvider translatorData
162
     */
163
    public function testGetTranslator($domain, $locale, $otherdomain, $expected): void
164
    {
165
        $loader = $this->getLoader($domain, $locale);
166
        $translator = $loader->getTranslator($otherdomain);
167
        $this->assertEquals(
168
            $expected,
169
            $translator->gettext('Type')
170
        );
171
    }
172
173
    public function translatorData(): array
174
    {
175
        return [
176
            [
177
                'phpmyadmin',
178
                'cs',
179
                '',
180
                'Typ',
181
            ],
182
            [
183
                'phpmyadmin',
184
                'cs_CZ',
185
                '',
186
                'Typ',
187
            ],
188
            [
189
                'phpmyadmin',
190
                'be_BY',
191
                '',
192
                'Тып',
193
            ],
194
            [
195
                'phpmyadmin',
196
                'be@latin',
197
                '',
198
                'Typ',
199
            ],
200
            [
201
                'phpmyadmin',
202
                'cs',
203
                'other',
204
                'Type',
205
            ],
206
            [
207
                'other',
208
                'cs',
209
                'phpmyadmin',
210
                'Type',
211
            ],
212
        ];
213
    }
214
215
    public function testInstance(): void
216
    {
217
        $loader = Loader::getInstance();
218
        $loader->setlocale('cs');
219
        $loader->textdomain('phpmyadmin');
220
        $loader->bindtextdomain('phpmyadmin', __DIR__ . '/data/locale/');
221
222
        $translator = $loader->getTranslator();
223
        $this->assertEquals(
224
            'Typ',
225
            $translator->gettext('Type')
226
        );
227
228
        /* Ensure the object survives */
229
        $loader = Loader::getInstance();
230
        $translator = $loader->getTranslator();
231
        $this->assertEquals(
232
            'Typ',
233
            $translator->gettext('Type')
234
        );
235
236
        /* Ensure the object can support different locale files for the same domain */
237
        $loader = Loader::getInstance();
238
        $loader->setlocale('be_BY');
239
        $loader->bindtextdomain('phpmyadmin', __DIR__ . '/data/locale/');
240
        $translator = $loader->getTranslator();
241
        $this->assertEquals(
242
            'Тып',
243
            $translator->gettext('Type')
244
        );
245
    }
246
247
    public function testDetect(): void
248
    {
249
        $GLOBALS['lang'] = 'foo';
250
        $loader = Loader::getInstance();
251
        $this->assertEquals(
252
            'foo',
253
            $loader->detectlocale()
254
        );
255
        unset($GLOBALS['lang']);
256
    }
257
258
    public function testDetectEnv(): void
259
    {
260
        $loader = Loader::getInstance();
261
        // putenv/getenv is broken on hhvm, do not fight with it
262
        foreach (['LC_MESSAGES', 'LC_ALL', 'LANG'] as $var) {
263
            putenv($var . '=baz');
264
            if (getenv($var) !== 'baz') {
265
                $this->markTestSkipped('Setting environment does not work');
266
            }
267
268
            putenv($var);
269
            if (getenv($var) === false) {
270
                continue;
271
            }
272
273
            $this->markTestSkipped('Unsetting environment does not work');
274
        }
275
276
        unset($GLOBALS['lang']);
277
        putenv('LC_ALL=baz');
278
        $this->assertEquals(
279
            'baz',
280
            $loader->detectlocale()
281
        );
282
        putenv('LC_ALL');
283
        putenv('LC_MESSAGES=bar');
284
        $this->assertEquals(
285
            'bar',
286
            $loader->detectlocale()
287
        );
288
        putenv('LC_MESSAGES');
289
        putenv('LANG=barr');
290
        $this->assertEquals(
291
            'barr',
292
            $loader->detectlocale()
293
        );
294
        putenv('LANG');
295
        $this->assertEquals(
296
            'en',
297
            $loader->detectlocale()
298
        );
299
    }
300
}
301