1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
declare( strict_types = 1 ); |
4
|
|
|
|
5
|
|
|
namespace Tests\DataValues\Geo\Values; |
6
|
|
|
|
7
|
|
|
use DataValues\Geo\Values\GlobeCoordinateValue; |
8
|
|
|
use DataValues\Geo\Values\LatLongValue; |
9
|
|
|
use DataValues\IllegalValueException; |
10
|
|
|
use PHPUnit\Framework\TestCase; |
11
|
|
|
|
12
|
|
|
/** |
13
|
|
|
* @covers \DataValues\Geo\Values\GlobeCoordinateValue |
14
|
|
|
* |
15
|
|
|
* @license GPL-2.0-or-later |
16
|
|
|
* @author Jeroen De Dauw < [email protected] > |
17
|
|
|
*/ |
18
|
|
|
class GlobeCoordinateValueTest extends TestCase { |
19
|
|
|
|
20
|
|
|
public function testGetLatitudeReturnsConstructorValue() { |
21
|
|
|
$this->assertSame( |
22
|
|
|
12.34, |
23
|
|
|
( new GlobeCoordinateValue( new LatLongValue( 12.34, 56.78 ) ) )->getLatitude() |
24
|
|
|
); |
25
|
|
|
} |
26
|
|
|
|
27
|
|
|
public function testGetLongitudeReturnsConstructorValue() { |
28
|
|
|
$this->assertSame( |
29
|
|
|
56.78, |
30
|
|
|
( new GlobeCoordinateValue( new LatLongValue( 12.34, 56.78 ) ) )->getLongitude() |
31
|
|
|
); |
32
|
|
|
} |
33
|
|
|
|
34
|
|
|
/** |
35
|
|
|
* @dataProvider validNonNullGlobeProvider |
36
|
|
|
*/ |
37
|
|
|
public function testGetGlobeReturnsConstructorValue( ?string $globe ) { |
38
|
|
|
$this->assertSame( |
39
|
|
|
$globe, |
40
|
|
|
( new GlobeCoordinateValue( |
41
|
|
|
new LatLongValue( 12.34, 56.78 ), |
42
|
|
|
null, |
43
|
|
|
$globe |
44
|
|
|
) )->getGlobe() |
45
|
|
|
); |
46
|
|
|
} |
47
|
|
|
|
48
|
|
|
public function validNonNullGlobeProvider() { |
49
|
|
|
yield [ GlobeCoordinateValue::GLOBE_EARTH ]; |
50
|
|
|
yield [ "coruscant" ]; |
51
|
|
|
yield [ "Schar's World" ]; |
52
|
|
|
yield [ 'a' ]; |
53
|
|
|
yield [ '0' ]; |
54
|
|
|
} |
55
|
|
|
|
56
|
|
|
public function testNullGlobeDefaultToEarth() { |
57
|
|
|
$this->assertSame( |
58
|
|
|
GlobeCoordinateValue::GLOBE_EARTH, |
59
|
|
|
( new GlobeCoordinateValue( new LatLongValue( 12.34, 56.78 ) ) )->getGlobe() |
60
|
|
|
); |
61
|
|
|
} |
62
|
|
|
|
63
|
|
|
/** |
64
|
|
|
* @dataProvider validPrecisionProvider |
65
|
|
|
*/ |
66
|
|
|
public function testGetPrecisionReturnsConstructorValue( float $precision ) { |
67
|
|
|
$this->assertSame( |
68
|
|
|
$precision, |
69
|
|
|
( new GlobeCoordinateValue( new LatLongValue( 12.34, 56.78 ), $precision ) )->getPrecision() |
70
|
|
|
); |
71
|
|
|
} |
72
|
|
|
|
73
|
|
|
public function validPrecisionProvider() { |
74
|
|
|
yield [ 360 ]; |
75
|
|
|
yield [ 359.9 ]; |
76
|
|
|
yield [ -360 ]; |
77
|
|
|
yield [ -359.9 ]; |
78
|
|
|
yield [ 0 ]; |
79
|
|
|
yield [ 1 ]; |
80
|
|
|
yield [ -1 ]; |
81
|
|
|
yield [ 0.1 ]; |
82
|
|
|
yield [ -0.1 ]; |
83
|
|
|
yield [ 123 ]; |
84
|
|
|
yield [ -123 ]; |
85
|
|
|
yield [ 123.4567890123456789 ]; |
86
|
|
|
} |
87
|
|
|
|
88
|
|
|
/** |
89
|
|
|
* @dataProvider illegalArrayValueProvider |
90
|
|
|
*/ |
91
|
|
|
public function testNewFromArrayErrorHandling( $data ) { |
92
|
|
|
$this->expectException( IllegalValueException::class ); |
93
|
|
|
GlobeCoordinateValue::newFromArray( $data ); |
|
|
|
|
94
|
|
|
} |
95
|
|
|
|
96
|
|
|
public function illegalArrayValueProvider() { |
97
|
|
|
return [ |
98
|
|
|
[ null ], |
99
|
|
|
[ '' ], |
100
|
|
|
[ [] ], |
101
|
|
|
[ [ 'latitude' => 0 ] ], |
102
|
|
|
[ [ 'longitude' => 0 ] ], |
103
|
|
|
]; |
104
|
|
|
} |
105
|
|
|
|
106
|
|
|
public function testArrayValueCompatibility() { |
107
|
|
|
// These serializations where generated using revision f91f65f989cc3ffacbe924012d8f5b574e0b710c |
108
|
|
|
// The strings are the result of calling getArrayValue on the objects and then feeding this to serialize. |
109
|
|
|
|
110
|
|
|
$serialization = 'a:5:{s:8:"latitude";d:-4.2000000000000002;' |
111
|
|
|
. 's:9:"longitude";d:42;' |
112
|
|
|
. 's:8:"altitude";N;' |
113
|
|
|
. 's:9:"precision";d:0.01;' |
114
|
|
|
. 's:5:"globe";s:4:"mars";}'; |
115
|
|
|
|
116
|
|
|
$arrayForm = unserialize( $serialization ); |
117
|
|
|
$globeCoordinate = GlobeCoordinateValue::newFromArray( $arrayForm ); |
|
|
|
|
118
|
|
|
|
119
|
|
|
$this->assertSame( -4.2, $globeCoordinate->getLatitude() ); |
120
|
|
|
$this->assertSame( 42.0, $globeCoordinate->getLongitude() ); |
121
|
|
|
$this->assertSame( 0.01, $globeCoordinate->getPrecision() ); |
122
|
|
|
$this->assertSame( 'mars', $globeCoordinate->getGlobe() ); |
123
|
|
|
|
124
|
|
|
$serialization = 'a:5:{s:8:"latitude";d:-4.2000000000000002;' |
125
|
|
|
. 's:9:"longitude";d:-42;' |
126
|
|
|
. 's:8:"altitude";d:9001;' |
127
|
|
|
. 's:9:"precision";d:1;' |
128
|
|
|
. 's:5:"globe";s:33:"http://www.wikidata.org/entity/Q2";}'; |
129
|
|
|
|
130
|
|
|
$arrayForm = unserialize( $serialization ); |
131
|
|
|
$globeCoordinate = GlobeCoordinateValue::newFromArray( $arrayForm ); |
|
|
|
|
132
|
|
|
|
133
|
|
|
$this->assertSame( -4.2, $globeCoordinate->getLatitude() ); |
134
|
|
|
$this->assertSame( -42.0, $globeCoordinate->getLongitude() ); |
135
|
|
|
$this->assertSame( 1.0, $globeCoordinate->getPrecision() ); |
136
|
|
|
$this->assertSame( 'http://www.wikidata.org/entity/Q2', $globeCoordinate->getGlobe() ); |
137
|
|
|
} |
138
|
|
|
|
139
|
|
|
public function testSerializeCompatibility() { |
140
|
|
|
$globeCoordinate = unserialize( |
141
|
|
|
'C:42:"DataValues\Geo\Values\GlobeCoordinateValue":27:{[-4.2,-42,null,0.01,"mars"]}' |
142
|
|
|
); |
143
|
|
|
$this->assertInstanceOf( GlobeCoordinateValue::class, $globeCoordinate ); |
144
|
|
|
|
145
|
|
|
$this->assertSame( -4.2, $globeCoordinate->getLatitude() ); |
146
|
|
|
$this->assertSame( -42.0, $globeCoordinate->getLongitude() ); |
147
|
|
|
$this->assertSame( 0.01, $globeCoordinate->getPrecision() ); |
148
|
|
|
$this->assertSame( 'mars', $globeCoordinate->getGlobe() ); |
149
|
|
|
|
150
|
|
|
$globeCoordinate = unserialize( |
151
|
|
|
'C:42:"DataValues\Geo\Values\GlobeCoordinateValue":27:{[-4.2,-42,9001,0.01,"mars"]}' |
152
|
|
|
); |
153
|
|
|
$this->assertInstanceOf( GlobeCoordinateValue::class, $globeCoordinate ); |
154
|
|
|
} |
155
|
|
|
|
156
|
|
|
public function testHashIsConsistentAcrossDifferentRuntimeEnvironments() { |
157
|
|
|
$latLongValue = new LatLongValue( 12.2, 12.2 ); |
158
|
|
|
|
159
|
|
|
$globeCoordinateValue = new GlobeCoordinateValue( $latLongValue, 0.1, 'does not matter' ); |
160
|
|
|
|
161
|
|
|
$this->assertSame( '08a33f1bbb4c8bd91b6531b5bffd91fd', $globeCoordinateValue->getHash() ); |
162
|
|
|
} |
163
|
|
|
|
164
|
|
|
public function testGetLatLong() { |
165
|
|
|
$latLong = new LatLongValue( 1, 2 ); |
166
|
|
|
|
167
|
|
|
$this->assertSame( |
168
|
|
|
$latLong, |
169
|
|
|
( new GlobeCoordinateValue( $latLong ) )->getLatLong() |
170
|
|
|
); |
171
|
|
|
} |
172
|
|
|
|
173
|
|
|
public function testTooHighPrecisionCausesInvalidArgumentException() { |
174
|
|
|
$this->expectException( \InvalidArgumentException::class ); |
175
|
|
|
new GlobeCoordinateValue( new LatLongValue( 1, 2 ), 360.1 ); |
176
|
|
|
} |
177
|
|
|
|
178
|
|
|
public function testTooLowPrecisionCausesInvalidArgumentException() { |
179
|
|
|
$this->expectException( \InvalidArgumentException::class ); |
180
|
|
|
new GlobeCoordinateValue( new LatLongValue( 1, 2 ), -360.1 ); |
181
|
|
|
} |
182
|
|
|
|
183
|
|
|
public function testEmptyGlobeCausesInvalidArgumentException() { |
184
|
|
|
$this->expectException( \InvalidArgumentException::class ); |
185
|
|
|
new GlobeCoordinateValue( new LatLongValue( 1, 2 ), null, '' ); |
186
|
|
|
} |
187
|
|
|
|
188
|
|
|
/** |
189
|
|
|
* @dataProvider instanceProvider |
190
|
|
|
*/ |
191
|
|
|
public function testValuesEqualThemselves( GlobeCoordinateValue $globeValue ) { |
192
|
|
|
$this->assertTrue( $globeValue->equals( $globeValue ) ); |
193
|
|
|
} |
194
|
|
|
|
195
|
|
|
public function instanceProvider() { |
196
|
|
|
$argLists[] = yield [ new GlobeCoordinateValue( new LatLongValue( 4.2, 4.2 ), 1 ) ]; |
|
|
|
|
197
|
|
|
$argLists[] = yield [ new GlobeCoordinateValue( new LatLongValue( 4.2, 42 ), 1 ) ]; |
198
|
|
|
$argLists[] = yield [ new GlobeCoordinateValue( new LatLongValue( 42, 4.2 ), 0.1 ) ]; |
199
|
|
|
$argLists[] = yield [ new GlobeCoordinateValue( new LatLongValue( 42, 42 ), 0.1 ) ]; |
200
|
|
|
$argLists[] = yield [ new GlobeCoordinateValue( new LatLongValue( -4.2, -4.2 ), 0.1 ) ]; |
201
|
|
|
$argLists[] = yield [ new GlobeCoordinateValue( new LatLongValue( 4.2, -42 ), 0.1 ) ]; |
202
|
|
|
$argLists[] = yield [ new GlobeCoordinateValue( new LatLongValue( -42, 4.2 ), 10 ) ]; |
203
|
|
|
$argLists[] = yield [ new GlobeCoordinateValue( new LatLongValue( 0, 0 ), 0.001 ) ]; |
204
|
|
|
$argLists[] = yield [ new GlobeCoordinateValue( new LatLongValue( 0, 0 ), 360 ) ]; |
205
|
|
|
$argLists[] = yield [ new GlobeCoordinateValue( new LatLongValue( 0, 0 ), -360 ) ]; |
206
|
|
|
|
207
|
|
|
$argLists[] = yield [ new GlobeCoordinateValue( new LatLongValue( 4.2, 4.2 ), 1, GlobeCoordinateValue::GLOBE_EARTH ) ]; |
208
|
|
|
$argLists[] = yield [ new GlobeCoordinateValue( new LatLongValue( 4.2, 4.2 ), 1, 'terminus' ) ]; |
209
|
|
|
$argLists[] = yield [ new GlobeCoordinateValue( new LatLongValue( 4.2, 4.2 ), 1, "Schar's World" ) ]; |
210
|
|
|
$argLists[] = yield [ new GlobeCoordinateValue( new LatLongValue( 4.2, 4.2 ), 1, 'coruscant' ) ]; |
211
|
|
|
$argLists[] = yield [ new GlobeCoordinateValue( new LatLongValue( 4.2, 4.2 ), 1, null ) ]; |
212
|
|
|
$argLists[] = yield [ new GlobeCoordinateValue( new LatLongValue( 4.2, 4.2 ), null ) ]; |
213
|
|
|
} |
214
|
|
|
|
215
|
|
|
/** |
216
|
|
|
* @dataProvider instanceProvider |
217
|
|
|
*/ |
218
|
|
|
public function testIdenticalValuesAreEqual( GlobeCoordinateValue $globeValue ) { |
219
|
|
|
$this->assertTrue( $globeValue->equals( $globeValue->getCopy() ) ); |
220
|
|
|
} |
221
|
|
|
|
222
|
|
|
/** |
223
|
|
|
* @dataProvider instanceProvider |
224
|
|
|
*/ |
225
|
|
|
public function testSerializeRountripsWithUnserialize( GlobeCoordinateValue $globeValue ) { |
226
|
|
|
$this->assertEquals( |
227
|
|
|
$globeValue, |
228
|
|
|
unserialize( serialize( $globeValue ) ) |
229
|
|
|
); |
230
|
|
|
} |
231
|
|
|
|
232
|
|
|
/** |
233
|
|
|
* @dataProvider instanceProvider |
234
|
|
|
*/ |
235
|
|
|
public function testGetArrayValueAndNewFromArrayRoundtrip( GlobeCoordinateValue $globeValue ) { |
236
|
|
|
$this->assertEquals( |
237
|
|
|
$globeValue, |
238
|
|
|
GlobeCoordinateValue::newFromArray( $globeValue->getArrayValue() ) |
|
|
|
|
239
|
|
|
); |
240
|
|
|
} |
241
|
|
|
|
242
|
|
|
/** |
243
|
|
|
* @dataProvider instanceProvider |
244
|
|
|
*/ |
245
|
|
|
public function testGetSortkeyReturnsLatitude( GlobeCoordinateValue $globeValue ) { |
246
|
|
|
$this->assertSame( |
247
|
|
|
$globeValue->getLatitude(), |
248
|
|
|
$globeValue->getSortKey() |
249
|
|
|
); |
250
|
|
|
} |
251
|
|
|
|
252
|
|
|
/** |
253
|
|
|
* @dataProvider instanceProvider |
254
|
|
|
*/ |
255
|
|
|
public function testGetValueReturnsItself( GlobeCoordinateValue $globeValue ) { |
256
|
|
|
$this->assertSame( |
257
|
|
|
$globeValue, |
258
|
|
|
$globeValue->getValue() |
259
|
|
|
); |
260
|
|
|
} |
261
|
|
|
|
262
|
|
|
} |
263
|
|
|
|
This method has been deprecated. The supplier of the class has supplied an explanatory message.
The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.