summaryrefslogtreecommitdiff
path: root/ext/date/tests
diff options
context:
space:
mode:
authorOndřej Surý <ondrej@sury.org>2010-10-21 08:52:46 +0200
committerOndřej Surý <ondrej@sury.org>2010-10-21 08:52:46 +0200
commit01fcdff3849c3691d9aaeaab735846ab6d8895ca (patch)
tree6460876d356113fa7053df36f2aa00baa7db24a9 /ext/date/tests
parent855a09f4eded707941180c9d90acd17c25e29447 (diff)
downloadphp-upstream/5.3.3.tar.gz
Imported Upstream version 5.3.3upstream/5.3.3
Diffstat (limited to 'ext/date/tests')
-rw-r--r--ext/date/tests/DateTimeZone_listAbbreviations_basic1.phpt2
-rw-r--r--ext/date/tests/bug45554.phpt6
-rw-r--r--ext/date/tests/bug46111.phpt21
-rw-r--r--ext/date/tests/bug48187.phpt26
-rw-r--r--ext/date/tests/bug48678.phpt4
-rw-r--r--ext/date/tests/bug49059.phpt34
-rw-r--r--ext/date/tests/bug49081.phpt22
-rw-r--r--ext/date/tests/bug49700.phpt15
-rw-r--r--ext/date/tests/bug49778.phpt30
-rw-r--r--ext/date/tests/bug50055.phpt30
-rw-r--r--ext/date/tests/bug50392.phpt84
-rw-r--r--ext/date/tests/bug50475.phpt18
-rw-r--r--ext/date/tests/bug51096.phpt55
-rw-r--r--ext/date/tests/bug51393.phpt75
-rw-r--r--ext/date/tests/bug51819.phpt31
-rw-r--r--ext/date/tests/bug51994.phpt38
-rw-r--r--ext/date/tests/bug52290.phpt27
-rw-r--r--ext/date/tests/date_diff.phpt59
18 files changed, 520 insertions, 57 deletions
diff --git a/ext/date/tests/DateTimeZone_listAbbreviations_basic1.phpt b/ext/date/tests/DateTimeZone_listAbbreviations_basic1.phpt
index bd6344fa2..126c4b832 100644
--- a/ext/date/tests/DateTimeZone_listAbbreviations_basic1.phpt
+++ b/ext/date/tests/DateTimeZone_listAbbreviations_basic1.phpt
@@ -26,7 +26,7 @@ var_dump( $abbr["acst"] );
--EXPECT--
*** Testing DateTimeZone::listAbbreviations() : basic functionality ***
string(5) "array"
-int(338)
+int(399)
-- Format a sample entry --
array(4) {
diff --git a/ext/date/tests/bug45554.phpt b/ext/date/tests/bug45554.phpt
index 9416214e9..0e9ebfd14 100644
--- a/ext/date/tests/bug45554.phpt
+++ b/ext/date/tests/bug45554.phpt
@@ -9,12 +9,12 @@ $d = date_create_from_format($format, "03-15-2005 12:22:29.000000 PST");
echo $d->format($format), "\n";
$d = date_create_from_format($format, "03-15-2005 12:22:29.001001 PST");
-echo $d->format($format), "\n";
+echo $d->format($format), " (precision isn't enough to show the 1 here)\n";
$d = date_create_from_format($format, "03-15-2005 12:22:29.0010 PST");
-var_dump( $d );
+echo $d->format($format), "\n";
?>
--EXPECT--
03-15-2005 12:22:29.000000 PST
+03-15-2005 12:22:29.001000 PST (precision isn't enough to show the 1 here)
03-15-2005 12:22:29.001000 PST
-bool(false)
diff --git a/ext/date/tests/bug46111.phpt b/ext/date/tests/bug46111.phpt
new file mode 100644
index 000000000..806424ebc
--- /dev/null
+++ b/ext/date/tests/bug46111.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Bug #46111 (strtotime() returns false for some valid timezones)
+--FILE--
+<?php
+date_default_timezone_set('Asia/Calcutta');
+$timezones = timezone_identifiers_list();
+
+# An empty list indicates no errors
+print "[strtotime(timezone) == false - Begin List]\n";
+foreach ($timezones as $zone) {
+ $date_string = "2008-01-01 13:00:00 " . $zone;
+
+ if (!strtotime($date_string)) {
+ echo $zone . "\n";
+ }
+}
+print "[strtotime(timezone) == false - End List]\n";
+?>
+--EXPECT--
+[strtotime(timezone) == false - Begin List]
+[strtotime(timezone) == false - End List]
diff --git a/ext/date/tests/bug48187.phpt b/ext/date/tests/bug48187.phpt
new file mode 100644
index 000000000..24a295ddd
--- /dev/null
+++ b/ext/date/tests/bug48187.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Bug #48187 (DateTime::diff() corrupting microtime() result)
+--FILE--
+<?php
+// two arbitrary dates
+$date1 = new DateTime('2005-07-23');
+$date2 = new DateTime('2006-02-14');
+
+$begin_u = microtime(true);
+$begin_t = time();
+
+if (microtime(true) - $begin_u < 1) {
+ var_dump('microtime() difference less 1 second');
+} else {
+ var_dump('microtime() difference greater or equal 1 second');
+}
+
+if (time() - $begin_t < 1) {
+ var_dump('time() difference less 1 second');
+} else {
+ var_dump('time() difference greater or equal 1 second');
+}
+?>
+--EXPECTF--
+string(36) "microtime() difference less 1 second"
+string(31) "time() difference less 1 second" \ No newline at end of file
diff --git a/ext/date/tests/bug48678.phpt b/ext/date/tests/bug48678.phpt
index bf349412b..896693463 100644
--- a/ext/date/tests/bug48678.phpt
+++ b/ext/date/tests/bug48678.phpt
@@ -16,7 +16,7 @@ DateInterval Object
[i] => 30
[s] => 5
[invert] => 0
- [days] => 0
+ [days] =>
)
DateInterval Object
(
@@ -27,5 +27,5 @@ DateInterval Object
[i] => 30
[s] => 5
[invert] => 0
- [days] => 0
+ [days] =>
)
diff --git a/ext/date/tests/bug49059.phpt b/ext/date/tests/bug49059.phpt
new file mode 100644
index 000000000..48d2dacb2
--- /dev/null
+++ b/ext/date/tests/bug49059.phpt
@@ -0,0 +1,34 @@
+--TEST--
+Bug #49059 (DateTime::diff() repeats previous sub() operation)
+--FILE--
+<?php
+date_default_timezone_set('Asia/Calcutta');
+
+$date1 = date_create("2009-03-27");
+$date2 = date_create("2009-03-01");
+print "\$date1 at init: " . $date1->format("Y-m-d") . "\n";
+print "\$date2 at init: " . $date2->format("Y-m-d") . "\n";
+$diff = $date1->diff($date2);
+print "\$date1 after first diff: " . $date1->format("Y-m-d") . "\n";
+print "\$diff->days after first diff: " . $diff->days . "\n";
+$date1 = $date1->sub(new DateInterval("P2D"));
+print "\$date1 after sub: " . $date1->format("Y-m-d") . "\n";
+$diff = $date1->diff($date2);
+print "\$date1 after second diff (called at \$date1): " .
+$date1->format("Y-m-d") . "\n";
+print "\$diff->days after second diff: " . $diff->days . "\n";
+$diff = $date2->diff($date1);
+print "\$date1 after third diff (called at \$date2): " .
+$date1->format("Y-m-d") . "\n";
+print "\$diff->days after third diff: " . $diff->days . "\n";
+?>
+--EXPECT--
+$date1 at init: 2009-03-27
+$date2 at init: 2009-03-01
+$date1 after first diff: 2009-03-27
+$diff->days after first diff: 26
+$date1 after sub: 2009-03-25
+$date1 after second diff (called at $date1): 2009-03-25
+$diff->days after second diff: 24
+$date1 after third diff (called at $date2): 2009-03-25
+$diff->days after third diff: 24
diff --git a/ext/date/tests/bug49081.phpt b/ext/date/tests/bug49081.phpt
new file mode 100644
index 000000000..f4f02903d
--- /dev/null
+++ b/ext/date/tests/bug49081.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Bug #49081 (DateTime::diff() mistake if start in January and interval > 28 days)
+--FILE--
+<?php
+ date_default_timezone_set('Europe/Berlin');
+ $d1 = new DateTime('2010-01-01 06:00:00');
+ $d2 = new DateTime('2010-01-31 10:00:00');
+ $d = $d1->diff($d2);
+ print_r($d);
+?>
+--EXPECT--
+DateInterval Object
+(
+ [y] => 0
+ [m] => 0
+ [d] => 30
+ [h] => 4
+ [i] => 0
+ [s] => 0
+ [invert] => 0
+ [days] => 30
+)
diff --git a/ext/date/tests/bug49700.phpt b/ext/date/tests/bug49700.phpt
new file mode 100644
index 000000000..a34705259
--- /dev/null
+++ b/ext/date/tests/bug49700.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Bug #49700 (memory leaks in php_date.c if garbage collector is enabled)
+--INI--
+date.timezone=GMT
+--FILE--
+<?php
+gc_enable();
+$objs = array();
+$objs[1] = new DateTime();
+gc_collect_cycles();
+unset($objs);
+echo "OK\n";
+?>
+--EXPECT--
+OK
diff --git a/ext/date/tests/bug49778.phpt b/ext/date/tests/bug49778.phpt
new file mode 100644
index 000000000..67c8e27f9
--- /dev/null
+++ b/ext/date/tests/bug49778.phpt
@@ -0,0 +1,30 @@
+--TEST--
+Bug #49778 (DateInterval::format("%a") is always zero when an interval is created from an ISO string)
+--FILE--
+<?php
+$i=new DateInterval('P7D');
+var_dump($i);
+echo $i->format("%d"), "\n";
+echo $i->format("%a"), "\n";
+?>
+--EXPECT--
+object(DateInterval)#1 (8) {
+ ["y"]=>
+ int(0)
+ ["m"]=>
+ int(0)
+ ["d"]=>
+ int(7)
+ ["h"]=>
+ int(0)
+ ["i"]=>
+ int(0)
+ ["s"]=>
+ int(0)
+ ["invert"]=>
+ int(0)
+ ["days"]=>
+ bool(false)
+}
+7
+(unknown)
diff --git a/ext/date/tests/bug50055.phpt b/ext/date/tests/bug50055.phpt
new file mode 100644
index 000000000..907bb93e4
--- /dev/null
+++ b/ext/date/tests/bug50055.phpt
@@ -0,0 +1,30 @@
+--TEST--
+Bug #50555 (DateTime::sub() allows 'relative' time modifications).
+--FILE--
+<?php
+$now = '2010-03-07 13:21:38 UTC';
+//positive DateInterval
+$da1 = date_create( $now );
+$ds1 = date_create( $now );
+$i = DateInterval::createFromDateString('third Tuesday of next month');
+echo $da1->format( DateTime::ISO8601 ), "\n";
+echo date_add($da1, $i)->format( DateTime::ISO8601 ), "\n";
+date_sub($ds1, $i);
+
+//negative DateInterval
+$da2 = date_create( $now );
+$ds2 = date_create( $now );
+$i2 = DateInterval::createFromDateString('third Tuesday of last month');
+echo $da2->format( DateTime::ISO8601 ), "\n";
+echo date_add($da2, $i2)->format( DateTime::ISO8601 ), "\n";//works
+date_sub($ds2, $i);
+?>
+--EXPECTF--
+2010-03-07T13:21:38+0000
+2010-04-20T13:21:38+0000
+
+Warning: date_sub(): Only non-special relative time specifications are supported for subtraction in %sbug50055.php on line 9
+2010-03-07T13:21:38+0000
+2010-02-16T13:21:38+0000
+
+Warning: date_sub(): Only non-special relative time specifications are supported for subtraction in %sbug50055.php on line 17
diff --git a/ext/date/tests/bug50392.phpt b/ext/date/tests/bug50392.phpt
index 8d10923e0..4fa506ef5 100644
--- a/ext/date/tests/bug50392.phpt
+++ b/ext/date/tests/bug50392.phpt
@@ -7,57 +7,39 @@ date_default_timezone_set('Europe/Bratislava');
$base = '2009-03-01 18:00:00';
for ($i = 0; $i < 8; $i++) {
- var_dump(date_create_from_format('Y-m-d H:i:s.u', $base . '.' . str_repeat('1', $i)));
+ $string = $base . '.' . str_repeat($i, $i);
+ echo $string, "\n- ";
+ $result = date_parse_from_format('Y-m-d H:i:s.u', $string);
+ echo $result['fraction'] ? $result['fraction'] : 'X', "\n";
+ foreach( $result['errors'] as $error ) {
+ echo "- ", $error, "\n";
+ }
+ echo "\n";
}
?>
--EXPECT--
-bool(false)
-object(DateTime)#2 (3) {
- ["date"]=>
- string(19) "2009-03-01 18:00:00"
- ["timezone_type"]=>
- int(3)
- ["timezone"]=>
- string(17) "Europe/Bratislava"
-}
-object(DateTime)#2 (3) {
- ["date"]=>
- string(19) "2009-03-01 18:00:00"
- ["timezone_type"]=>
- int(3)
- ["timezone"]=>
- string(17) "Europe/Bratislava"
-}
-object(DateTime)#2 (3) {
- ["date"]=>
- string(19) "2009-03-01 18:00:00"
- ["timezone_type"]=>
- int(3)
- ["timezone"]=>
- string(17) "Europe/Bratislava"
-}
-object(DateTime)#2 (3) {
- ["date"]=>
- string(19) "2009-03-01 18:00:00"
- ["timezone_type"]=>
- int(3)
- ["timezone"]=>
- string(17) "Europe/Bratislava"
-}
-object(DateTime)#2 (3) {
- ["date"]=>
- string(19) "2009-03-01 18:00:00"
- ["timezone_type"]=>
- int(3)
- ["timezone"]=>
- string(17) "Europe/Bratislava"
-}
-object(DateTime)#2 (3) {
- ["date"]=>
- string(19) "2009-03-01 18:00:00"
- ["timezone_type"]=>
- int(3)
- ["timezone"]=>
- string(17) "Europe/Bratislava"
-}
-bool(false)
+2009-03-01 18:00:00.
+- X
+- Data missing
+
+2009-03-01 18:00:00.1
+- 0.1
+
+2009-03-01 18:00:00.22
+- 0.22
+
+2009-03-01 18:00:00.333
+- 0.333
+
+2009-03-01 18:00:00.4444
+- 0.4444
+
+2009-03-01 18:00:00.55555
+- 0.55555
+
+2009-03-01 18:00:00.666666
+- 0.666666
+
+2009-03-01 18:00:00.7777777
+- 0.777777
+- Trailing data
diff --git a/ext/date/tests/bug50475.phpt b/ext/date/tests/bug50475.phpt
new file mode 100644
index 000000000..454e86c6b
--- /dev/null
+++ b/ext/date/tests/bug50475.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Bug #50475 (DateTime::setISODate followed by DateTime::setTime)
+--FILE--
+<?php
+date_default_timezone_set('Asia/Calcutta');
+
+$date = new DateTime('18-01-2009 00:00:00');
+
+$date->setISODate(2009, 6, 1);
+
+var_dump($date->format('Y-m-d H:i:s'));
+
+$date->setTime(8, 0);
+var_dump($date->format('Y-m-d H:i:s'));
+?>
+--EXPECT--
+string(19) "2009-02-02 00:00:00"
+string(19) "2009-02-02 08:00:00" \ No newline at end of file
diff --git a/ext/date/tests/bug51096.phpt b/ext/date/tests/bug51096.phpt
new file mode 100644
index 000000000..31503bc7a
--- /dev/null
+++ b/ext/date/tests/bug51096.phpt
@@ -0,0 +1,55 @@
+--TEST--
+Bug #51096: Test for "first day" vs "first day of".
+--FILE--
+<?php
+$tests = array(
+ 'first day',
+ 'last day',
+ 'next month',
+ 'first day next month',
+ 'last day next month',
+ 'first day of next month',
+ 'last day of next month'
+);
+
+foreach ( $tests as $test )
+{
+ $result = date_parse( $test );
+ $rel = $result['relative'];
+ echo $test, "\n- month: ", $rel['month'], '; day: ', $rel['day'],
+ '; first-day-of: ', isset( $rel['first_day_of_month'] ) ? 'true' : 'false',
+ '; last-day-of: ', isset( $rel['last_day_of_month'] ) ? 'true' : 'false', "\n";
+ $date = new DateTime( '2010-03-06 15:21 UTC' );
+ echo '- ', $date->format( DateTime::ISO8601 );
+ $date->modify( $test );
+ echo ' -> ', $date->format( DateTime::ISO8601 ), "\n\n";
+}
+?>
+--EXPECT--
+first day
+- month: 0; day: 1; first-day-of: false; last-day-of: false
+- 2010-03-06T15:21:00+0000 -> 2010-03-07T15:21:00+0000
+
+last day
+- month: 0; day: -1; first-day-of: false; last-day-of: false
+- 2010-03-06T15:21:00+0000 -> 2010-03-05T15:21:00+0000
+
+next month
+- month: 1; day: 0; first-day-of: false; last-day-of: false
+- 2010-03-06T15:21:00+0000 -> 2010-04-06T15:21:00+0000
+
+first day next month
+- month: 1; day: 1; first-day-of: false; last-day-of: false
+- 2010-03-06T15:21:00+0000 -> 2010-04-07T15:21:00+0000
+
+last day next month
+- month: 1; day: -1; first-day-of: false; last-day-of: false
+- 2010-03-06T15:21:00+0000 -> 2010-04-05T15:21:00+0000
+
+first day of next month
+- month: 1; day: 0; first-day-of: true; last-day-of: false
+- 2010-03-06T15:21:00+0000 -> 2010-04-01T15:21:00+0000
+
+last day of next month
+- month: 1; day: 0; first-day-of: false; last-day-of: true
+- 2010-03-06T15:21:00+0000 -> 2010-04-30T15:21:00+0000
diff --git a/ext/date/tests/bug51393.phpt b/ext/date/tests/bug51393.phpt
new file mode 100644
index 000000000..e3f0983ae
--- /dev/null
+++ b/ext/date/tests/bug51393.phpt
@@ -0,0 +1,75 @@
+--TEST--
+Bug #51393 (DateTime::createFromFormat() fails if format string contains timezone)
+--INI--
+date.timezone=UTC
+--FILE--
+<?php
+$dt = DateTime::createFromFormat('O', '+0800');
+var_dump($dt->getOffset());
+
+$dt = DateTime::createFromFormat('P', '+08:00');
+var_dump($dt->getOffset());
+
+$dt = DateTime::createFromFormat('O', '-0800');
+var_dump($dt->getOffset());
+
+$dt = DateTime::createFromFormat('P', '-08:00');
+var_dump($dt->getOffset());
+
+$dt = DateTime::createFromFormat('[O]', '[+0800]');
+var_dump($dt->getOffset());
+
+$dt = DateTime::createFromFormat('[P]', '[+08:00]');
+var_dump($dt->getOffset());
+
+$dt = DateTime::createFromFormat('[O]', '[-0800]');
+var_dump($dt->getOffset());
+
+$dt = DateTime::createFromFormat('[P]', '[-08:00]');
+var_dump($dt->getOffset());
+
+$dt = DateTime::createFromFormat('O', 'GMT+0800');
+var_dump($dt->getOffset());
+
+$dt = DateTime::createFromFormat('P', 'GMT+08:00');
+var_dump($dt->getOffset());
+
+$dt = DateTime::createFromFormat('O', 'GMT-0800');
+var_dump($dt->getOffset());
+
+$dt = DateTime::createFromFormat('P', 'GMT-08:00');
+var_dump($dt->getOffset());
+
+$dt = DateTime::createFromFormat('[O]', '[GMT+0800]');
+var_dump($dt->getOffset());
+
+$dt = DateTime::createFromFormat('[P]', '[GMT+08:00]');
+var_dump($dt->getOffset());
+
+$dt = DateTime::createFromFormat('[O]', '[GMT-0800]');
+var_dump($dt->getOffset());
+
+$dt = DateTime::createFromFormat('[P]', '[GMT-08:00]');
+var_dump($dt->getOffset());
+
+$dt = DateTime::createFromFormat('O', 'invalid');
+var_dump($dt);
+?>
+--EXPECT--
+int(28800)
+int(28800)
+int(-28800)
+int(-28800)
+int(28800)
+int(28800)
+int(-28800)
+int(-28800)
+int(28800)
+int(28800)
+int(-28800)
+int(-28800)
+int(28800)
+int(28800)
+int(-28800)
+int(-28800)
+bool(false)
diff --git a/ext/date/tests/bug51819.phpt b/ext/date/tests/bug51819.phpt
new file mode 100644
index 000000000..afcb9c7d4
--- /dev/null
+++ b/ext/date/tests/bug51819.phpt
@@ -0,0 +1,31 @@
+--TEST--
+Bug #51819 (Case discrepancy in timezone names cause Uncaught exception and fatal error)
+--FILE--
+<?php
+$aTzAbbr = timezone_abbreviations_list();
+
+$aTz = array();
+foreach (array_keys($aTzAbbr) as $sKey) {
+ foreach (array_keys($aTzAbbr[$sKey]) as $iIndex) {
+ $sTz = $aTzAbbr[$sKey][$iIndex]['timezone_id'];
+
+ if (! in_array($sTz, $aTz)) {
+ array_push($aTz, $sTz);
+ }
+ }
+}
+
+foreach ($aTz as $sTz) {
+ $sDate = '2010-05-15 00:00:00 ' . $sTz;
+
+ try {
+ $oDateTime = new DateTime($sDate);
+ } catch (Exception $oException) {
+ var_dump($oException->getMessage());
+ }
+}
+
+var_dump('this should be the only output');
+?>
+--EXPECTF--
+string(30) "this should be the only output" \ No newline at end of file
diff --git a/ext/date/tests/bug51994.phpt b/ext/date/tests/bug51994.phpt
new file mode 100644
index 000000000..e136c8f2b
--- /dev/null
+++ b/ext/date/tests/bug51994.phpt
@@ -0,0 +1,38 @@
+--TEST--
+Bug #51994 (date_parse_from_format is parsing invalid date using 'yz' format)
+--FILE--
+<?php
+$trans_date = '10153'; // 152nd day of year 2010 -> 03.06.2010
+$a_date = date_parse_from_format('yz', $trans_date);
+
+var_dump($a_date);
+?>
+--EXPECTF--
+array(12) {
+ ["year"]=>
+ int(2010)
+ ["month"]=>
+ int(6)
+ ["day"]=>
+ int(3)
+ ["hour"]=>
+ bool(false)
+ ["minute"]=>
+ bool(false)
+ ["second"]=>
+ bool(false)
+ ["fraction"]=>
+ bool(false)
+ ["warning_count"]=>
+ int(0)
+ ["warnings"]=>
+ array(0) {
+ }
+ ["error_count"]=>
+ int(0)
+ ["errors"]=>
+ array(0) {
+ }
+ ["is_localtime"]=>
+ bool(false)
+} \ No newline at end of file
diff --git a/ext/date/tests/bug52290.phpt b/ext/date/tests/bug52290.phpt
new file mode 100644
index 000000000..c1ee9d47a
--- /dev/null
+++ b/ext/date/tests/bug52290.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Bug #52290 (setDate, setISODate, setTime works wrong when DateTime created from timestamp)
+--FILE--
+<?php
+$tz = 'UTC';
+date_default_timezone_set($tz);
+
+$ts = strtotime('2006-01-01');
+$dt = new DateTime('@'.$ts);
+$dt->setTimezone(new DateTimeZone($tz));
+
+var_dump($dt->format('o-\WW-N | Y-m-d | H:i:s | U'));
+
+$dt->setISODate(2005, 52, 1);
+var_dump($dt->format('o-\WW-N | Y-m-d | H:i:s | U'));
+
+$dt->setDate(2007, 10, 10);
+var_dump($dt->format('o-\WW-N | Y-m-d | H:i:s | U'));
+
+$dt->setTime(20, 30, 40);
+var_dump($dt->format('o-\WW-N | Y-m-d | H:i:s | U'));
+?>
+--EXPECTF--
+string(47) "2005-W52-7 | 2006-01-01 | 00:00:00 | 1136073600"
+string(47) "2005-W52-1 | 2005-12-26 | 00:00:00 | 1135555200"
+string(47) "2007-W40-5 | 2007-10-10 | 00:00:00 | 1191974400"
+string(47) "2007-W40-5 | 2007-10-10 | 20:30:40 | 1192048240" \ No newline at end of file
diff --git a/ext/date/tests/date_diff.phpt b/ext/date/tests/date_diff.phpt
new file mode 100644
index 000000000..31783a884
--- /dev/null
+++ b/ext/date/tests/date_diff.phpt
@@ -0,0 +1,59 @@
+--TEST--
+Extensive test for date_diff().
+--INI--
+date.timezone=UTC
+--FILE--
+<?php
+$ok = 0;
+define( 'COUNT', 120 );
+$d0 = new DateTime('2009-11-20');
+for ( $i = 0; $i < COUNT * 12; $i++ )
+{
+ $d = clone $d0;
+ $dates[$i] = $d->add( new DateInterval( "P{$i}D" ) );
+}
+
+for ( $i = 0; $i < COUNT; $i++)
+{
+// echo $dates[$i]->format( "Y-m-d\n" );
+ for ( $j = 0; $j < COUNT * 12; $j++)
+ {
+ $diff = date_diff( $dates[$i], $dates[$j] );
+ /*
+ printf( "\t%s %s %3d %s\n",
+ $dates[$i]->format( 'Y-m-d' ),
+ $dates[$j]->format( 'Y-m-d' ),
+ $diff->format( '%a' ),
+ $diff->format( '%y-%m-%d' )
+ );
+ */
+
+ $current = clone $dates[$i];
+ $int = new DateInterval( $diff->format( 'P%yY%mM%dD' ) );
+ if ( $current > $dates[$j] )
+ {
+ $current->sub( $int );
+ }
+ else
+ {
+ $current->add( $int );
+ }
+ if ( $current != $dates[$j] )
+ {
+ echo "FAIL: ",
+ $dates[$i]->format( 'Y-m-d' ), " + ",
+ $int->format( '%y-%m-%d' ), " = ",
+ $current->format( 'Y-m-d' ), " (",
+ $dates[$j]->format( 'Y-m-d' ), ")\n";
+ }
+ else
+ {
+ $ok++;
+ }
+ }
+}
+
+echo $ok, "\n";
+?>
+--EXPECT--
+172800