forked from Skillshare/formatphp
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathOfTest.php
More file actions
132 lines (112 loc) · 4.17 KB
/
OfTest.php
File metadata and controls
132 lines (112 loc) · 4.17 KB
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
<?php
declare(strict_types=1);
namespace FormatPHP\Test\Intl\DisplayNames;
use FormatPHP\Exception\InvalidArgumentException;
use FormatPHP\Intl\DisplayNames;
use FormatPHP\Intl\DisplayNamesOptions;
use FormatPHP\Intl\Locale;
use FormatPHP\Test\TestCase;
/**
* @phpstan-import-type OptionsType from DisplayNamesOptions
*/
class OfTest extends TestCase
{
private const LOCALES = [
'en-US',
'de-DE',
'ko-KR',
];
private const STYLE = [
'long',
'narrow',
'short',
];
private const TYPE = [
'currency' => ['USD', 'EUR', 'FOO'],
'language' => ['en-Latn-US', 'en-GB', 'pt-BR', 'foobar'],
'region' => ['US', 'BR', '419', 'YY', '123'],
'script' => ['Latn', 'Arab', 'Foob'],
// 'calendar' => [], // These values have no support in JS.
// 'dateTimeField' => [],
];
private const LANGUAGE_DISPLAY = [
// 'dialect', // PHP isn't able to support "dialect"
'standard',
];
private const FALLBACK = [
'code',
'none',
];
public function testThrowsExceptionWhenTypeNotSet(): void
{
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('The type property must be set');
new DisplayNames();
}
public function testThrowsExceptionForInvalidTypes(): void
{
$options = new DisplayNamesOptions();
$options->type = 'calendar';
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('The type property must be either "language", "region", "script", or "currency"');
new DisplayNames(null, $options);
}
/**
* Rather than use a data provider and make thousands of snapshot files,
* we'll build up one big snapshot file and assert it.
*
* The snapshot file for this test was created using Intl.DisplayNames in
* NodeJS, in order to ensure parity. The script that generated the snapshot
* is displayNames_test.js.
*/
public function testOf(): void
{
$tests = $this->displayNamesPermutationsWithLocales();
$results = [];
foreach ($tests as $test => $parameters) {
$locale = new Locale($parameters['locale']);
$formatOptions = new DisplayNamesOptions($parameters['options']);
$formatter = new DisplayNames($locale, $formatOptions);
$results[$test] = [
'result' => $formatter->of($parameters['testValue']),
'options' => $parameters['options'],
];
}
$this->assertMatchesJsonSnapshot($results);
}
/**
* @return array<array{locale: string, testValue: string, options: OptionsType}>
*/
public function displayNamesPermutationsWithLocales(): array
{
$tests = [];
foreach (self::LOCALES as $locale) {
foreach (self::STYLE as $style) {
foreach (self::LANGUAGE_DISPLAY as $languageDisplay) {
foreach (self::FALLBACK as $fallback) {
foreach (self::TYPE as $type => $testValues) {
foreach ($testValues as $testValue) {
$description = "$locale style/$style "
. "languageDisplay/$languageDisplay "
. "fallback/$fallback "
. "type/$type "
. "of($testValue)";
$tests[$description] = [
'locale' => $locale,
'testValue' => $testValue,
'options' => [
'style' => $style,
'languageDisplay' => $languageDisplay,
'fallback' => $fallback,
'type' => $type,
],
];
}
}
}
}
}
}
return $tests;
}
}