Passed
Pull Request — master (#140)
by
unknown
09:19
created

testSpecificLowerTimestamps()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 8
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 0
1
<?php
2
3
namespace DataValues\Tests;
4
5
use DataValues\TimeValue;
6
use DataValues\TimeValueCalculator;
7
8
/**
9
 * @covers DataValues\TimeValueCalculator
10
 *
11
 * @group DataValue
12
 * @group DataValueExtensions
13
 *
14
 * @license GPL-2.0+
15
 * @author Thiemo Kreuz
16
 */
17
class TimeValueCalculatorTest extends \PHPUnit_Framework_TestCase {
18
19
	/**
20
	 * @var TimeValueCalculator
21
	 */
22
	private $calculator;
23
24
	protected function setUp() {
25
		$this->calculator = new TimeValueCalculator();
26
	}
27
28
	/**
29
	 * @param string $time an ISO 8601 date and time
30
	 * @param int $timezone offset from UTC in minutes
31
	 *
32
	 * @return TimeValue
33
	 */
34
	private function getTimeValueMock( $time, $timezone = 0 ) {
35
		$timeValue = $this->getMockBuilder( TimeValue::class )
36
			->disableOriginalConstructor()
37
			->getMock();
38
39
		$timeValue->expects( $this->any() )
40
			->method( 'getTime' )
41
			->will( $this->returnValue( $time ) );
42
		$timeValue->expects( $this->any() )
43
			->method( 'getTimezone' )
44
			->will( $this->returnValue( $timezone ) );
45
		$timeValue->expects( $this->any() )
46
			->method( 'getPrecision' )
47
			->will( $this->returnValue( TimeValue::PRECISION_DAY ) );
48
		$timeValue->expects( $this->any() )
49
			->method( 'getCalendarModel' )
50
			->will( $this->returnValue( 'Stardate' ) );
51
52
		return $timeValue;
53
	}
54
55
	public function timestampProvider() {
56
		return array(
57
			// Make sure it's identical to the PHP/Unix time stamps in current years
58
			array( '+2004-02-29T00:00:00Z', strtotime( '2004-02-29T00:00:00+00:00' ) ),
59
			array( '+2038-00-00T00:00:00Z', strtotime( '2038-01-01T00:00:00+00:00' ) ),
60
61
			// Time zones
62
			array( '+2000-01-01T12:59:59', strtotime( '2000-01-01T12:59:59-02:00' ), -120 ),
63
			array( '+2000-01-01T12:59:59', strtotime( '2000-01-01T12:59:59+04:45' ), 285 ),
64
65
			array( '+0401-00-00T00:00:00Z', -49512816000 ),
66
			array( '+1902-00-00T00:00:00Z', -2145916800 ),
67
			array( '+1939-00-00T00:00:00Z', -978307200 ),
68
			array( '+1969-12-31T23:59:00Z', -60 ),
69
			array( '+1969-12-31T23:59:59Z', -1 ),
70
			array( '+1970-01-01T00:00:00Z', 0 ),
71
			array( '+1970-01-01T00:00:01Z', 1 ),
72
			array( '+1970-01-01T00:01:00Z', 60 ),
73
			array( '+1972-02-29T00:00:00Z', 68169600 ),
74
			array( '+1996-02-29T00:00:00Z', 825552000 ),
75
			array( '+1999-12-31T23:59:59Z', 946684799 ),
76
			array( '+2000-01-01T00:00:00Z', 946684800 ),
77
			array( '+2000-02-01T00:00:00Z', 949363200 ),
78
			array( '+2000-02-29T00:00:00Z', 951782400 ),
79
			array( '+2001-00-00T00:00:00Z', 978307200 ),
80
			array( '+2001-01-01T00:00:00Z', 978307200 ),
81
			array( '+2014-04-30T12:35:55Z', 1398861355 ),
82
			array( '+2401-00-00T00:00:00Z', 13601088000 ),
83
84
			// Make sure there is only 1 second between these two
85
			array( '-0001-12-31T23:59:59Z', -62135596801 ),
86
			array( '+0001-00-00T00:00:00Z', -62135596800 ),
87
88
			// No special calculation for leap seconds, just make sure they pass
89
			array( '+1970-10-11T12:13:61Z', 24495241 ),
90
			array( '+1970-10-11T12:14:01Z', 24495241 ),
91
92
			// Year 0 does not exist, but we do not complain, assume -1
93
			array( '-0000-12-31T23:59:59Z', -62135596801 ),
94
			array( '+0000-00-00T00:00:00Z', floor( ( -1 - 1969 ) * 365.2425 ) * 86400 ),
95
96
			// Since there is no year 0, negative leap years are -1, -5 and so on
97
			array( '-8001-00-00T00:00:00Z', floor( ( -8001 - 1969 ) * 365.2425 ) * 86400 ),
98
			array( '-0005-00-00T00:00:00Z', floor( ( -5 - 1969 ) * 365.2425 ) * 86400 ),
99
			array( '+0004-00-00T00:00:00Z', floor( ( 4 - 1970 ) * 365.2425 ) * 86400 ),
100
			array( '+8000-00-00T00:00:00Z', floor( ( 8000 - 1970 ) * 365.2425 ) * 86400 ),
101
102
			// PHP_INT_MIN is -2147483648
103
			array( '-2147484001-00-00T00:00:00Z', floor( ( -2147484001 - 1969 ) * 365.2425 ) * 86400 ),
104
			// PHP_INT_MAX is +2147483647
105
			array( '+2147484000-00-00T00:00:00Z', floor( ( 2147484000 - 1970 ) * 365.2425 ) * 86400 ),
106
		);
107
	}
108
109
	/**
110
	 * @dataProvider timestampProvider
111
	 */
112
	public function testGetTimestamp( $time, $expectedTimestamp = 0.0, $timezone = 0 ) {
113
		$timeValue = $this->getTimeValueMock( $time, $timezone );
114
		$timestamp = $this->calculator->getTimestamp( $timeValue );
115
116
		$this->assertEquals( $expectedTimestamp, $timestamp );
117
	}
118
119
	public function yearProvider() {
120
		return array(
121
			// Every 4 years
122
			array( 1895, 459 ),
123
			array( 1896, 460, true ),
124
			array( 1897, 460 ),
125
126
			// Not every 100 years but every 400 years
127
			array( 1900, 460 ),
128
			array( 2000, 485, true ),
129
			array( 2100, 509 ),
130
131
			// Extremes
132
			array( 1, 0 ),
133
			array( 9999, 2424 ),
134
			array( 2147483647, 520764784 ),
135
136
			// There is no year zero, assume -1
137
			array( -1, 0, true ),
138
			array( 0, 0, true ),
139
140
			// Off by 1 for negative years because zero is skipped
141
			array( -6, -2 ),
142
			array( -5, -1, true ),
143
			array( -4, -1 ),
144
			array( -3, -1 ),
145
			array( -2, -1 ),
146
			array( -1, 0, true ),
147
			array( 1, 0 ),
148
			array( 2, 0 ),
149
			array( 3, 0 ),
150
			array( 4, 1, true ),
151
			array( 5, 1 ),
152
153
			// Because we can
154
			array( -6.9, -2 ),
155
			array( -6.1, -2 ),
156
			array( -5.501, -1, true ),
157
			array( -5.499, -1, true ),
158
			array( -4.6, -1 ),
159
			array( -4.4, -1 ),
160
			array( 1995.01, 483 ),
161
			array( 1995.09, 483 ),
162
			array( 1996.001, 484, true ),
163
			array( 1996.009, 484, true ),
164
			array( 1997.1, 484 ),
165
			array( 1997.9, 484 ),
166
		);
167
	}
168
169
	/**
170
	 * @dataProvider yearProvider
171
	 */
172
	public function testIsLeapYear( $year, $numberOfLeapYears, $expected = false ) {
0 ignored issues
show
Unused Code introduced by
The parameter $numberOfLeapYears is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
173
		$isLeapYear = $this->calculator->isLeapYear( $year );
174
175
		$this->assertEquals( $expected, $isLeapYear );
176
	}
177
178
	/**
179
	 * @dataProvider yearProvider
180
	 */
181
	public function testGetNumberOfLeapYears( $year, $expected, $isLeapYear = false ) {
0 ignored issues
show
Unused Code introduced by
The parameter $isLeapYear is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
182
		$numberOfLeapYears = $this->calculator->getNumberOfLeapYears( $year );
183
184
		$this->assertEquals( $expected, $numberOfLeapYears );
185
	}
186
187
	public function precisionProvider() {
188
		$secondsPerDay = 60 * 60 * 24;
189
		$daysPerGregorianYear = 365 + 1 / 4 - 1 / 100 + 1 / 400;
190
191
		return array(
192
			array( TimeValue::PRECISION_SECOND, 1 ),
193
			array( TimeValue::PRECISION_MINUTE, 60 ),
194
			array( TimeValue::PRECISION_HOUR, 60 * 60 ),
195
			array( TimeValue::PRECISION_DAY, $secondsPerDay ),
196
			array( TimeValue::PRECISION_MONTH, $secondsPerDay * $daysPerGregorianYear / 12 ),
197
			array( TimeValue::PRECISION_YEAR, $secondsPerDay * $daysPerGregorianYear ),
198
			array( TimeValue::PRECISION_YEAR10, $secondsPerDay * $daysPerGregorianYear * 1e1 ),
199
			array( TimeValue::PRECISION_YEAR1G, $secondsPerDay * $daysPerGregorianYear * 1e9 ),
200
		);
201
	}
202
203
	/**
204
	 * @dataProvider precisionProvider
205
	 */
206
	public function testGetSecondsForPrecision( $precision, $expected ) {
207
		$seconds = $this->calculator->getSecondsForPrecision( $precision );
208
209
		$this->assertEquals( $expected, $seconds );
210
	}
211
212
	/**
213
	 * @return array of ISO 8601 timestamps from lower to higher
214
	 */
215
	private function provideTimestampsWithoutSign() {
216
		return [
217
			'0001-01-11T06:08:04Z',
218
			'0016-02-11T06:08:04Z',
219
			'0245-03-30T00:00:00Z',
220
			'1054-04-11T14:00:02Z',
221
			'2012-02-29T23:59:59Z',
222
			'2012-03-01T00:00:00Z',
223
			'2013-05-31T23:59:59Z',
224
			'2014-06-01T00:00:00Z',
225
			'54844518-07-25T02:00:00Z',
226
			'5748404518-08-25T02:00:00Z',
227
			'9990994999299999-09-09T14:20:00Z',
228
			'9999999999999999-10-15T14:20:00Z',
229
		];
230
	}
231
232
	/**
233
	 * @return array of precisions from the most to the least precise
234
	 */
235
	private function provideAllPrecisions() {
236
		return [
237
			TimeValue::PRECISION_SECOND,
238
			TimeValue::PRECISION_MINUTE,
239
			TimeValue::PRECISION_HOUR,
240
			TimeValue::PRECISION_DAY,
241
			TimeValue::PRECISION_MONTH,
242
			TimeValue::PRECISION_YEAR,
243
			TimeValue::PRECISION_YEAR10,
244
			TimeValue::PRECISION_YEAR100,
245
			TimeValue::PRECISION_YEAR1K,
246
			TimeValue::PRECISION_YEAR10K,
247
			TimeValue::PRECISION_YEAR100K,
248
			TimeValue::PRECISION_YEAR1M,
249
			TimeValue::PRECISION_YEAR10M,
250
			TimeValue::PRECISION_YEAR100M,
251
			TimeValue::PRECISION_YEAR1G
252
		];
253
	}
254
255
	/**
256
	 * @return \Generator
257
	 */
258
	public function provideTimestamps() { // any order
259
		foreach ( [ '+', '-' ] as $sign ) {
260
			foreach ( $this->provideTimestampsWithoutSign() as $timestamp ) {
261
				yield $sign . $timestamp;
262
			}
263
		}
264
	}
265
266
	/**
267
	 * @return \Generator
268
	 */
269
	public function provideTimeValuesHighVsLowPrecisions() {
270
		$oldTimestamp = null;
271
		$oldPrecision = null;
272
		foreach ( $this->provideTimestamps() as $timestamp ) {
273
			foreach ( $this->provideAllPrecisions() as $precision ) {
274
				if ( !empty( $oldTimestamp ) && $timestamp === $oldTimestamp ) {
275
					$oldTimeValue = new TimeValue(
276
						$oldTimestamp,
277
						0, 0, 0,
278
						$oldPrecision,
279
						TimeValue::CALENDAR_GREGORIAN
280
					);
281
					$timeValue = new TimeValue(
282
						$timestamp,
283
						0, 0, 0,
284
						$precision,
285
						TimeValue::CALENDAR_GREGORIAN
286
					);
287
					yield [ [ $oldTimeValue, $timeValue ] ];
288
				}
289
				$oldTimestamp = $timestamp;
290
				$oldPrecision = $precision;
291
			}
292
		}
293
	}
294
295
	/**
296
	 * @return \Generator
297
	 */
298
	public function provideTimestampsAndPrecisions() {
299
		foreach ( $this->provideTimestamps() as $timestamp ) {
300
			foreach ( $this->provideAllPrecisions() as $precision ) {
301
				yield [ [ $timestamp, $precision ] ];
302
			}
303
		}
304
	}
305
306
	/**
307
	 * @return \Generator of ISO 8601 timestamp arrays [ t1, t2 ] where t1 ≤ t2
308
	 */
309
	public function provideTimestampPairs() {
310
		foreach ( [ '+', '-' ] as $sign ) {
311
			$oldTimestamp = null;
312
			foreach ( $this->provideTimestampsWithoutSign() as $timestamp ) {
313
				$timestamp = $sign . $timestamp;
314
				if ( $oldTimestamp !== null ) {
315
					yield $sign === '+' ? [ [ $oldTimestamp, $timestamp ] ] : [ [ $timestamp, $oldTimestamp ] ];
316
				}
317
				$oldTimestamp = $timestamp;
318
			}
319
		}
320
	}
321
322
	/**
323
	 * @return \Generator of arrays of:
324
	 * - a TimeValue,
325
	 * - its lower Unix timestamp, and
326
	 * - its Unix higher timestamp.
327
	 */
328
	public function provideTimeValuesAndLowerAndHigherTimestamps() {
329
		$timeValuesAndLowerAndHigherTimestamps = [
330
			[
331
				new TimeValue( // BCE calculations can differ one year from external ones
332
					'-0754-11-27T10:49:31Z',
333
					0, 0, 0,
334
					TimeValue::PRECISION_SECOND,
335
					TimeValue::CALENDAR_GREGORIAN
336
				),
337
				-85901001029,
338
				-85901001029
339
			],
340
			[
341
				new TimeValue( // BCE calculations can differ one year from external ones
342
					'-0003-01-06T10:49:31Z',
343
					0, 0, 0,
344
					TimeValue::PRECISION_YEAR,
345
					TimeValue::CALENDAR_GREGORIAN
346
				),
347
				-62230291200,
348
				-62198755201
349
			],
350
			[
351
				new TimeValue(
352
					'+0002-07-17T02:41:22Z',
353
					0, 0, 0,
354
					TimeValue::PRECISION_DAY,
355
					TimeValue::CALENDAR_GREGORIAN
356
				),
357
				-62087040000,
358
				-62086953601
359
			],
360
			[
361
				new TimeValue(
362
					'+2013-03-14T12:51:02Z',
363
					0, 0, 0,
364
					TimeValue::PRECISION_MONTH,
365
					TimeValue::CALENDAR_GREGORIAN
366
				),
367
				1362096000,
368
				1364774399
369
			],
370
			[
371
				new TimeValue(
372
					'+7254-11-27T10:49:31Z',
373
					0, 0, 0,
374
					TimeValue::PRECISION_SECOND,
375
					TimeValue::CALENDAR_GREGORIAN
376
				),
377
				166775539771,
378
				166775539771
379
			],
380
			[
381
				new TimeValue(
382
					'+190134401-01-15T10:39:59Z',
383
					0, 0, 0,
384
					TimeValue::PRECISION_DAY,
385
					TimeValue::CALENDAR_GREGORIAN
386
				),
387
				5999999999961600,
388
				6000000000047999
389
			],
390
			[
391
				new TimeValue(
392
					'+190134401-01-15T10:39:59Z',
393
					0, 0, 0,
394
					TimeValue::PRECISION_SECOND,
395
					TimeValue::CALENDAR_GREGORIAN
396
				),
397
				5999999999999999,
398
				5999999999999999
399
			],
400
		];
401
		yield $timeValuesAndLowerAndHigherTimestamps;
402
	}
403
404
	/**
405
	 * Check that a few TimeValue values are equal to their expected getLowerTimestamp() ones.
406
	 *
407
	 * @dataProvider provideTimeValuesAndLowerAndHigherTimestamps
408
	 */
409
	public function testSpecificLowerTimestamps() {
410
		$timeValuesAndLowerTimestamps = func_get_args();
411
		$timeValueCalculator = new TimeValueCalculator();
412
		foreach ( $timeValuesAndLowerTimestamps as $timeValueAndLowerTimestamp ) {
413
			$unixLowerTimestamp = $timeValueCalculator->getLowerTimestamp( $timeValueAndLowerTimestamp[0] );
414
			$this->assertEquals( $timeValueAndLowerTimestamp[1], $unixLowerTimestamp );
415
		}
416
	}
417
418
	/**
419
	 * Check that a few TimeValue values are equal to their expected getHigherTimestamp() ones.
420
	 *
421
	 * @dataProvider provideTimeValuesAndLowerAndHigherTimestamps
422
	 */
423
	public function testSpecificHigherTimestamps() {
424
		$timeValuesAndHigherTimestamps = func_get_args();
425
		$timeValueCalculator = new TimeValueCalculator();
426
		foreach ( $timeValuesAndHigherTimestamps as $timeValueAndHigherTimestamp ) {
427
			$unixHigherTimestamp = $timeValueCalculator->getHigherTimestamp( $timeValueAndHigherTimestamp[0] );
428
			$this->assertEquals( $timeValueAndHigherTimestamp[2], $unixHigherTimestamp );
429
		}
430
	}
431
432
	/**
433
	 * Check that timestampWithoutSignProvider() values are ordered from earliest to latest according
434
	 * to getLowerTimestamp(),
435
	 *
436
	 * @dataProvider provideTimestampPairs
437
	 */
438
	public function testOrderingLowerTimestamps() {
439
		$timeValueCalculator = new TimeValueCalculator();
440
		$timestampPairs = func_get_args();
441
		foreach ( $timestampPairs as $timestampPair ) {
442
			$earlierTimestamp = $timestampPair[0];
443
			$laterTimestamp = $timestampPair[1];
444
			$earlierTimeValue = new TimeValue(
445
				$earlierTimestamp,
446
				0, 0, 0,
447
				TimeValue::PRECISION_DAY,
448
				TimeValue::CALENDAR_GREGORIAN
449
			);
450
			$laterTimeValue = new TimeValue(
451
				$laterTimestamp,
452
				0, 0, 0,
453
				TimeValue::PRECISION_DAY,
454
				TimeValue::CALENDAR_GREGORIAN
455
			);
456
			$earlierUnixLowerTimestamp = $timeValueCalculator->getLowerTimestamp( $earlierTimeValue );
457
			$laterUnixLowerTimestamp = $timeValueCalculator->getLowerTimestamp( $laterTimeValue );
458
			$this->assertGreaterThanOrEqual( $earlierUnixLowerTimestamp, $laterUnixLowerTimestamp );
459
		}
460
	}
461
462
	/**
463
	 * Check that timestampWithoutSignProvider() values are ordered from earliest to latest according
464
	 * to getHigherTimestamp(),
465
	 *
466
	 * @dataProvider provideTimestampPairs
467
	 */
468
	public function testOrderingHigherTimestamps() {
469
		$timeValueCalculator = new TimeValueCalculator();
470
		$timestampPairs = func_get_args();
471
		foreach ( $timestampPairs as $timestampPair ) {
472
			$earlierTimestamp = $timestampPair[0];
473
			$laterTimestamp = $timestampPair[1];
474
			$earlierTimeValue = new TimeValue(
475
				$earlierTimestamp,
476
				0, 0, 0,
477
				TimeValue::PRECISION_DAY,
478
				TimeValue::CALENDAR_GREGORIAN
479
			);
480
			$laterTimeValue = new TimeValue(
481
				$laterTimestamp,
482
				0, 0, 0,
483
				TimeValue::PRECISION_DAY,
484
				TimeValue::CALENDAR_GREGORIAN
485
			);
486
			$earlierUnixHigherTimestamp = $timeValueCalculator->getHigherTimestamp( $earlierTimeValue );
487
			$laterUnixHigherTimestamp = $timeValueCalculator->getHigherTimestamp( $laterTimeValue );
488
			$this->assertGreaterThanOrEqual( $earlierUnixHigherTimestamp, $laterUnixHigherTimestamp );
489
		}
490
	}
491
492
	/**
493
	 * Check that getTimestamp() values are always greater or equal than getLowerTimestamp() ones.
494
	 *
495
	 * @dataProvider provideTimestampsAndPrecisions
496
	 */
497
	public function testLowerTimestampsVsTimestamps() {
498
		$timeValueCalculator = new TimeValueCalculator();
499
		$timestampsAndPrecisions = func_get_args();
500
		foreach ( $timestampsAndPrecisions as $timestampAndPrecision ) {
501
			$timestamp = $timestampAndPrecision[0];
502
			$precision = $timestampAndPrecision[1];
503
			$timeValue = new TimeValue(
504
				$timestamp,
505
				0, 0, 0,
506
				$precision,
507
				TimeValue::CALENDAR_GREGORIAN
508
			);
509
			$unixTimestampAsIs = $timeValueCalculator->getTimestamp( $timeValue );
510
			$unixLowerTimestamp = $timeValueCalculator->getLowerTimestamp( $timeValue );
511
			$this->assertGreaterThanOrEqual( $unixLowerTimestamp, $unixTimestampAsIs );
512
		}
513
	}
514
515
	/**
516
	 * Check that getHigherTimestamp() values are always greater or equal than getTimestamp() ones.
517
	 *
518
	 * @dataProvider provideTimestampsAndPrecisions
519
	 */
520
	public function testHigherTimestampsVsTimestamps() {
521
		$timeValueCalculator = new TimeValueCalculator();
522
		$timestampsAndPrecisions = func_get_args();
523
		foreach ( $timestampsAndPrecisions as $timestampAndPrecision ) {
524
			$timestamp = $timestampAndPrecision[0];
525
			$precision = $timestampAndPrecision[1];
526
			$timeValue = new TimeValue(
527
				$timestamp,
528
				0, 0, 0,
529
				$precision,
530
				TimeValue::CALENDAR_GREGORIAN
531
			);
532
			$unixTimestampAsIs = $timeValueCalculator->getTimestamp( $timeValue );
533
			$unixHigherTimestamp = $timeValueCalculator->getHigherTimestamp( $timeValue );
534
			$this->assertGreaterThanOrEqual( $unixTimestampAsIs, $unixHigherTimestamp );
535
		}
536
	}
537
538
	/**
539
	 * Check that higher before values for the same timestamp always correspond to lower or equal
540
	 * getLowerTimestamp() values than lower before values.
541
	 *
542
	 * @dataProvider provideTimestampsAndPrecisions
543
	 */
544
	public function testGetLowerTimestampBefore() {
545
		$timeValueCalculator = new TimeValueCalculator();
546
		$timestampsAndPrecisions = func_get_args();
547
		foreach ( $timestampsAndPrecisions as $timestampAndPrecision ) {
548
			$timestamp = $timestampAndPrecision[0];
549
			$precision = $timestampAndPrecision[1];
550
			$timeValue = new TimeValue(
551
				$timestamp,
552
				0, 0, 1,
553
				$precision,
554
				TimeValue::CALENDAR_GREGORIAN
555
			);
556
			$unixLowerTimestamp = $timeValueCalculator->getLowerTimestamp( $timeValue );
557
			$timeValueBefore1 = new TimeValue(
558
				$timestamp,
559
				0, 1, 1,
560
				$precision,
561
				TimeValue::CALENDAR_GREGORIAN
562
			);
563
			$unixLowerTimestampBefore1 = $timeValueCalculator->getLowerTimestamp( $timeValueBefore1 );
564
			$timeValueBefore2 = new TimeValue(
565
				$timestamp,
566
				0, 2, 0,
567
				$precision,
568
				TimeValue::CALENDAR_GREGORIAN
569
			);
570
			$unixLowerTimestampBefore2 = $timeValueCalculator->getLowerTimestamp( $timeValueBefore2 );
571
			if ( $unixLowerTimestamp > -10000000000000 && $unixLowerTimestamp < 10000000000000 ) {
572
				$this->assertGreaterThan( $unixLowerTimestampBefore1, $unixLowerTimestamp );
573
				$this->assertGreaterThan( $unixLowerTimestampBefore2, $unixLowerTimestampBefore1 );
574
			} else {
575
				$this->assertGreaterThanOrEqual( $unixLowerTimestampBefore1, $unixLowerTimestamp );
576
				$this->assertGreaterThanOrEqual( $unixLowerTimestampBefore2, $unixLowerTimestampBefore1 );
577
			}
578
		}
579
	}
580
581
	/**
582
	 * Check that lower after values for the same timestamp always correspond to lower or equal
583
	 * getHigherTimestamp() values than higher after values.
584
	 *
585
	 * @dataProvider provideTimestampsAndPrecisions
586
	 */
587
	public function testGetHigherTimestampAfter() {
588
		$timeValueCalculator = new TimeValueCalculator();
589
		$timestampsAndPrecisions = func_get_args();
590
		foreach ( $timestampsAndPrecisions as $timestampAndPrecision ) {
591
			$timestamp = $timestampAndPrecision[0];
592
			$precision = $timestampAndPrecision[1];
593
			$timeValue = new TimeValue(
594
				$timestamp,
595
				0, 1, 0,
596
				$precision,
597
				TimeValue::CALENDAR_GREGORIAN
598
			);
599
			$unixHigherTimestamp = $timeValueCalculator->getHigherTimestamp( $timeValue );
600
			$timeValueAfter1 = new TimeValue(
601
				$timestamp,
602
				0, 1, 1,
603
				$precision,
604
				TimeValue::CALENDAR_GREGORIAN
605
			);
606
			$unixHigherTimestampAfter1 = $timeValueCalculator->getHigherTimestamp( $timeValueAfter1 );
607
			$timeValueAfter2 = new TimeValue(
608
				$timestamp,
609
				0, 0, 2,
610
				$precision,
611
				TimeValue::CALENDAR_GREGORIAN
612
			);
613
			$unixHigherTimestampAfter2 = $timeValueCalculator->getHigherTimestamp( $timeValueAfter2 );
614
			if ( $unixHigherTimestamp > -10000000000000 && $unixHigherTimestamp < 10000000000000 ) {
615
				$this->assertGreaterThan( $unixHigherTimestamp, $unixHigherTimestampAfter1 );
616
				$this->assertGreaterThan( $unixHigherTimestampAfter1, $unixHigherTimestampAfter2 );
617
			} else {
618
				$this->assertGreaterThanOrEqual( $unixHigherTimestamp, $unixHigherTimestampAfter1 );
619
				$this->assertGreaterThanOrEqual( $unixHigherTimestampAfter1, $unixHigherTimestampAfter2 );
620
			}
621
		}
622
	}
623
624
	/**
625
	 * Check that higher precisions of the same timestamp always correspond to greater or equal
626
	 * getLowerTimestamp() values than lower precisions.
627
	 *
628
	 * @dataProvider provideTimeValuesHighVsLowPrecisions
629
	 */
630
	public function testGetLowerTimestampsHighVsLowPrecisions() {
631
		$timeValueCalculator = new TimeValueCalculator();
632
		$timeValuesHighVsLowPrecisions = func_get_args();
633
		foreach ( $timeValuesHighVsLowPrecisions as $timeValueHighVsLowPrecision ) {
634
			$timestampHighPrecision = $timeValueCalculator->getLowerTimestamp( $timeValueHighVsLowPrecision[0] );
635
			$timestampLowPrecision = $timeValueCalculator->getLowerTimestamp( $timeValueHighVsLowPrecision[1] );
636
			$this->assertGreaterThanOrEqual( $timestampLowPrecision, $timestampHighPrecision );
637
		}
638
	}
639
640
	/**
641
	 * Check that lower precisions of the same timestamp always correspond to greater or equal
642
	 * getHigherTimestamp() values than higher precisions.
643
	 *
644
	 * @dataProvider provideTimeValuesHighVsLowPrecisions
645
	 */
646
	public function testGetHigherTimestampsHighVsLowPrecisions() {
647
		$timeValueCalculator = new TimeValueCalculator();
648
		$timeValuesHighVsLowPrecisions = func_get_args();
649
		foreach ( $timeValuesHighVsLowPrecisions as $timeValueHighVsLowPrecision ) {
650
			$timestampHighPrecision = $timeValueCalculator->getHigherTimestamp( $timeValueHighVsLowPrecision[0] );
651
			$timestampLowPrecision = $timeValueCalculator->getHigherTimestamp( $timeValueHighVsLowPrecision[1] );
652
			$this->assertGreaterThanOrEqual( $timestampHighPrecision, $timestampLowPrecision );
653
		}
654
	}
655
656
}
657