Passed
Push — zeroRounding ( 491d2a...2f1015 )
by no
35:13 queued 21:46
created

GlobeCoordinateParserTest::getParserClass()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
dl 0
loc 3
c 1
b 0
f 0
rs 10
cc 1
eloc 2
nc 1
nop 0
1
<?php
2
3
namespace Tests\DataValues\Geo\Parsers;
4
5
use DataValues\Geo\Parsers\GlobeCoordinateParser;
6
use DataValues\Geo\Values\GlobeCoordinateValue;
7
use DataValues\Geo\Values\LatLongValue;
8
use ValueParsers\ParserOptions;
9
use ValueParsers\Test\StringValueParserTest;
10
11
/**
12
 * @covers DataValues\Geo\Parsers\GlobeCoordinateParser
13
 *
14
 * @group ValueParsers
15
 * @group DataValueExtensions
16
 *
17
 * @license GPL-2.0+
18
 * @author Jeroen De Dauw < [email protected] >
19
 * @author Thiemo Mättig
20
 */
21
class GlobeCoordinateParserTest extends StringValueParserTest {
22
23
	/**
24
	 * @see ValueParserTestBase::getInstance
25
	 *
26
	 * @return GlobeCoordinateParser
27
	 */
28
	protected function getInstance() {
29
		return new GlobeCoordinateParser();
30
	}
31
32
	/**
33
	 * @see ValueParserTestBase::validInputProvider
34
	 */
35
	public function validInputProvider() {
36
		$argLists = [];
37
38
		$valid = [
39
			// Whitespace
40
			"1N 1E\n" => [ 1, 1, 1 ],
41
			' 1N 1E ' => [ 1, 1, 1 ],
42
43
			// Float
44
			'55.7557860 N, 37.6176330 W' => [ 55.7557860, -37.6176330, 0.000001 ],
45
			'55.7557860N,37.6176330W' => [ 55.7557860, -37.6176330, 0.000001 ],
46
			'55.7557860, -37.6176330' => [ 55.7557860, -37.6176330, 0.000001 ],
47
			'55.7557860, -37.6176330    ' => [ 55.7557860, -37.6176330, 0.000001 ],
48
			'55 S, 37.6176330 W' => [ -55, -37.6176330, 0.000001 ],
49
			'55 S,37.6176330W' => [ -55, -37.6176330, 0.000001 ],
50
			'-55, -37.6176330' => [ -55, -37.6176330, 0.000001 ],
51
			'5.5S,37W ' => [ -5.5, -37, 0.1 ],
52
			'-5.5,-37 ' => [ -5.5, -37, 0.1 ],
53
			'-5.5 -37 ' => [ -5.5, -37, 0.1 ],
54
			'4,2' => [ 4, 2, 1 ],
55
			'5.5S 37W ' => [ -5.5, -37, 0.1 ],
56
			'5.5 S 37 W ' => [ -5.5, -37, 0.1 ],
57
			'4 2' => [ 4, 2, 1 ],
58
			'S5.5 W37 ' => [ -5.5, -37, 0.1 ],
59
60
			// DD
61
			'55.7557860° N, 37.6176330° W' => [ 55.7557860, -37.6176330, 0.000001 ],
62
			'55.7557860°, -37.6176330°' => [ 55.7557860, -37.6176330, 0.000001 ],
63
			'55.7557860°,-37.6176330°' => [ 55.7557860, -37.6176330, 0.000001 ],
64
			'55.7557860°,-37.6176330°  ' => [ 55.7557860, -37.6176330, 0.000001 ],
65
			'55° S, 37.6176330 ° W' => [ -55, -37.6176330, 0.000001 ],
66
			'-55°, -37.6176330 °' => [ -55, -37.6176330, 0.000001 ],
67
			'5.5°S,37°W ' => [ -5.5, -37, 0.1 ],
68
			'5.5° S,37° W ' => [ -5.5, -37, 0.1 ],
69
			'-5.5°,-37° ' => [ -5.5, -37, 0.1 ],
70
			'-55° -37.6176330 °' => [ -55, -37.6176330, 0.000001 ],
71
			'5.5°S 37°W ' => [ -5.5, -37, 0.1 ],
72
			'-5.5 ° -37 ° ' => [ -5.5, -37, 0.1 ],
73
			'S5.5° W37°' => [ -5.5, -37, 0.1 ],
74
			' S 5.5° W 37°' => [ -5.5, -37, 0.1 ],
75
76
			// DMS
77
			'55° 45\' 20.8296", 37° 37\' 3.4788"' => [ 55.755786, 37.617633, 0.0001 / 3600 ],
78
			'55° 45\' 20.8296", -37° 37\' 3.4788"' => [ 55.755786, -37.617633, 0.0001 / 3600 ],
79
			'-55° 45\' 20.8296", -37° 37\' 3.4788"' => [ -55.755786, -37.617633, 0.0001 / 3600 ],
80
			'-55° 45\' 20.8296", 37° 37\' 3.4788"' => [ -55.755786, 37.617633, 0.0001 / 3600 ],
81
			'-55° 45\' 20.8296", 37° 37\' 3.4788"  ' => [ -55.755786, 37.617633, 0.0001 / 3600 ],
82
			'55° 0\' 0", 37° 0\' 0"' => [ 55, 37, 1 / 3600 ],
83
			'55° 30\' 0", 37° 30\' 0"' => [ 55.5, 37.5, 1 / 3600 ],
84
			'55° 0\' 18", 37° 0\' 18"' => [ 55.005, 37.005, 1 / 3600 ],
85
			'  55° 0\' 18", 37° 0\' 18"' => [ 55.005, 37.005, 1 / 3600 ],
86
			'0° 0\' 0", 0° 0\' 0"' => [ 0, 0, 1 / 3600 ],
87
			'0° 0\' 18" N, 0° 0\' 18" E' => [ 0.005, 0.005, 1 / 3600 ],
88
			' 0° 0\' 18" S  , 0°  0\' 18"  W ' => [ -0.005, -0.005, 1 / 3600 ],
89
			'0° 0′ 18″ N, 0° 0′ 18″ E' => [ 0.005, 0.005, 1 / 3600 ],
90
			'0° 0\' 18" N  0° 0\' 18" E' => [ 0.005, 0.005, 1 / 3600 ],
91
			' 0 ° 0 \' 18 " S   0 °  0 \' 18 "  W ' => [ -0.005, -0.005, 1 / 3600 ],
92
			'0° 0′ 18″ N 0° 0′ 18″ E' => [ 0.005, 0.005, 1 / 3600 ],
93
			'N 0° 0\' 18" E 0° 0\' 18"' => [ 0.005, 0.005, 1 / 3600 ],
94
			'N0°0\'18"E0°0\'18"' => [ 0.005, 0.005, 1 / 3600 ],
95
			'N0°0\'18" E0°0\'18"' => [ 0.005, 0.005, 1 / 3600 ],
96
97
			// DM
98
			'55° 0\', 37° 0\'' => [ 55, 37, 1 / 60 ],
99
			'55° 30\', 37° 30\'' => [ 55.5, 37.5, 1 / 60 ],
100
			'0° 0\', 0° 0\'' => [ 0, 0, 1 / 60 ],
101
			'   0° 0\', 0° 0\'' => [ 0, 0, 1 / 60 ],
102
			'   0° 0\', 0° 0\'  ' => [ 0, 0, 1 / 60 ],
103
			'-55° 30\', -37° 30\'' => [ -55.5, -37.5, 1 / 60 ],
104
			'0° 0.3\' S, 0° 0.3\' W' => [ -0.005, -0.005, 1 / 3600 ],
105
			'-55° 30′, -37° 30′' => [ -55.5, -37.5, 1 / 60 ],
106
			'-55 ° 30 \' -37 ° 30 \'' => [ -55.5, -37.5, 1 / 60 ],
107
			'0° 0.3\' S 0° 0.3\' W' => [ -0.005, -0.005, 1 / 3600 ],
108
			'-55° 30′ -37° 30′' => [ -55.5, -37.5, 1 / 60 ],
109
			'S 0° 0.3\' W 0° 0.3\'' => [ -0.005, -0.005, 1 / 3600 ],
110
			'S0°0.3\'W0°0.3\'' => [ -0.005, -0.005, 1 / 3600 ],
111
			'S0°0.3\' W0°0.3\'' => [ -0.005, -0.005, 1 / 3600 ],
112
		];
113
114
		foreach ( $valid as $value => $expected ) {
115
			$expected = new GlobeCoordinateValue( new LatLongValue( $expected[0], $expected[1] ), $expected[2] );
116
			$argLists[] = [ (string)$value, $expected ];
117
		}
118
119
		return $argLists;
120
	}
121
122
	/**
123
	 * @see StringValueParserTest::invalidInputProvider
124
	 */
125
	public function invalidInputProvider() {
126
		$argLists = parent::invalidInputProvider();
127
128
		$invalid = [
129
			'~=[,,_,,]:3',
130
			'ohi there',
131
		];
132
133
		foreach ( $invalid as $value ) {
134
			$argLists[] = [ $value ];
135
		}
136
137
		return $argLists;
138
	}
139
140
	/**
141
	 * @dataProvider withGlobeOptionProvider
142
	 */
143
	public function testWithGlobeOption( $expected, $value, $options = null ) {
144
		$parser = new GlobeCoordinateParser();
145
146
		if ( $options ) {
147
			$parserOptions = new ParserOptions( json_decode( $options, true ) );
148
			$parser->setOptions( $parserOptions );
149
		}
150
151
		$value = $parser->parse( $value );
152
153
		$this->assertEquals( $expected, $value );
154
	}
155
156
	public function withGlobeOptionProvider() {
157
		$data = [];
158
159
		$data[] = [
160
			new GlobeCoordinateValue(
161
				new LatLongValue( 55.7557860, -37.6176330 ),
162
				0.000001,
163
				'http://www.wikidata.org/entity/Q2'
164
			),
165
			'55.7557860° N, 37.6176330° W',
166
			'{"globe":"http://www.wikidata.org/entity/Q2"}'
167
		];
168
169
		$data[] = [
170
			new GlobeCoordinateValue(
171
				new LatLongValue( 60.5, 260 ),
172
				0.1,
173
				'http://www.wikidata.org/entity/Q111'
174
			),
175
			'60.5, 260',
176
			'{"globe":"http://www.wikidata.org/entity/Q111"}'
177
		];
178
179
		$data[] = [
180
			new GlobeCoordinateValue(
181
				new LatLongValue( 40.2, 22.5 ),
182
				0.1,
183
				'http://www.wikidata.org/entity/Q2'
184
			),
185
			'40.2, 22.5',
186
		];
187
188
		return $data;
189
	}
190
191
	/**
192
	 * @dataProvider precisionDetectionProvider
193
	 */
194
	public function testPrecisionDetection( $value, $expected ) {
195
		$parser = new GlobeCoordinateParser();
196
		$globeCoordinateValue = $parser->parse( $value );
197
198
		$this->assertSame( $expected, $globeCoordinateValue->getPrecision() );
199
	}
200
201
	public function precisionDetectionProvider() {
202
		return [
203
			// Float
204
			[ '10 20', 1 ],
205
			[ '1 2', 1 ],
206
			[ '1.3 2.4', 0.1 ],
207
			[ '1.3 20', 0.1 ],
208
			[ '10 2.4', 0.1 ],
209
			[ '1.35 2.46', 0.01 ],
210
			[ '1.357 2.468', 0.001 ],
211
			[ '1.3579 2.468', 0.0001 ],
212
			[ '1.00001 2.00001', 0.00001 ],
213
			[ '1.000001 2.000001', 0.000001 ],
214
			[ '1.0000001 2.0000001', 0.0000001 ],
215
			[ '1.00000001 2.00000001', 0.00000001 ],
216
			[ '1.000000001 2.000000001', 1 ],
217
			[ '1.555555555 2.555555555', 0.00000001 ],
218
219
			// Dd
220
			[ '10° 20°', 1 ],
221
			[ '1° 2°', 1 ],
222
			[ '1.3° 2.4°', 0.1 ],
223
			[ '1.3° 20°', 0.1 ],
224
			[ '10° 2.4°', 0.1 ],
225
			[ '1.35° 2.46°', 0.01 ],
226
			[ '1.357° 2.468°', 0.001 ],
227
			[ '1.3579° 2.468°', 0.0001 ],
228
			[ '1.00001° 2.00001°', 0.00001 ],
229
			[ '1.000001° 2.000001°', 0.000001 ],
230
			[ '1.0000001° 2.0000001°', 0.0000001 ],
231
			[ '1.00000001° 2.00000001°', 0.00000001 ],
232
			[ '1.000000001° 2.000000001°', 1 ],
233
			[ '1.555555555° 2.555555555°', 0.00000001 ],
234
235
			// Dm
236
			[ '1°3\' 2°4\'', 1 / 60 ],
237
			[ '1°3\' 2°0\'', 1 / 60 ],
238
			[ '1°0\' 2°4\'', 1 / 60 ],
239
			[ '1°3.5\' 2°4.6\'', 1 / 3600 ],
240
			[ '1°3.57\' 2°4.68\'', 1 / 36000 ],
241
			[ '1°3.579\' 2°4.68\'', 1 / 360000 ],
242
			[ '1°3.0001\' 2°4.0001\'', 1 / 3600000 ],
243
			[ '1°3.00001\' 2°4.00001\'', 1 / 36000000 ],
244
			[ '1°3.000001\' 2°4.000001\'', 1 / 36000000 ],
245
			[ '1°3.0000001\' 2°4.0000001\'', 1 / 60 ],
246
			[ '1°3.5555555\' 2°4.5555555\'', 1 / 36000000 ],
247
248
			// Dms
249
			[ '1°3\'5" 2°4\'6"', 1 / 3600 ],
250
			[ '1°3\'5" 2°0\'0"', 1 / 3600 ],
251
			[ '1°0\'0" 2°4\'6"', 1 / 3600 ],
252
			[ '1°3\'0" 2°4\'0"', 1 / 3600 ],
253
			[ '1°3\'5.7" 2°4\'6.8"', 1 / 36000 ],
254
			[ '1°3\'5.79" 2°4\'6.8"', 1 / 360000 ],
255
			[ '1°3\'5.001" 2°4\'6.001"', 1 / 3600000 ],
256
			[ '1°3\'5.0001" 2°4\'6.0001"', 1 / 36000000 ],
257
			[ '1°3\'5.00001" 2°4\'6.00001"', 1 / 3600 ],
258
			[ '1°3\'5.55555" 2°4\'6.55555"', 1 / 36000000 ],
259
260
			/**
261
			 * @fixme What do the users expect in this case, 1/3600 or 1/360000?
262
			 * @see https://bugzilla.wikimedia.org/show_bug.cgi?id=64820
263
			 */
264
			[ '47°42\'0.00"N, 15°27\'0.00"E', 1 / 3600 ],
265
		];
266
	}
267
268
}
269