summaryrefslogtreecommitdiff
path: root/tests/unit/Util/TDateTimeStampTest.php
blob: e9a0a22f06da4e1cab1d92ffabb34be0a13a5884 (plain)
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
<?php

require_once dirname(__FILE__).'/../phpunit.php';

Prado::using('System.Util.TDateTimeStamp');

class TDateTimeStampTest extends PHPUnit_Framework_TestCase {
	
	public function testGetTimeStampAndFormat() {
		$s = new TDateTimeStamp;
		$t = $s->getTimeStamp(0,0,0);
		$this->assertEquals($s->formatDate('Y-m-d'), date('Y-m-d'));

		$t = $s->getTimeStamp(0,0,0,6,1,2102);
		$this->assertEquals($s->formatDate('Y-m-d',$t), '2102-06-01');

		$t = $s->getTimeStamp(0,0,0,2,1,2102);
		$this->assertEquals($s->formatDate('Y-m-d',$t), '2102-02-01');
	}

	public function testGregorianToJulianConversion() {
		$s = new TDateTimeStamp;
		$t = $s->getTimeStamp(0,0,0,10,11,1492);

		//http://www.holidayorigins.com/html/columbus_day.html - Friday check
		$this->assertEquals($s->formatDate('D Y-m-d',$t), 'Fri 1492-10-11');

		$t = $s->getTimeStamp(0,0,0,2,29,1500);
		$this->assertEquals($s->formatDate('Y-m-d',$t), '1500-02-29');

		$t = $s->getTimeStamp(0,0,0,2,29,1700);
		$this->assertEquals($s->formatDate('Y-m-d',$t), '1700-03-01');

	}

	public function testGregorianCorrection() {
		$s = new TDateTimeStamp;
		$diff = $s->getTimeStamp(0,0,0,10,15,1582) - $s->getTimeStamp(0,0,0,10,4,1582);

		//This test case fails on my windows machine!
		//$this->assertEquals($diff, 3600*24,
		//	"Error in gregorian correction = ".($diff/3600/24)." days");

		$this->assertEquals($s->getDayOfWeek(1582,10,15), 5.0);
		$this->assertEquals($s->getDayOfWeek(1582,10,4), 4.0);
	}

	public function testOverFlow() {
		$s = new TDateTimeStamp;
		$t = $s->getTimeStamp(0,0,0,3,33,1965);
		$this->assertEquals($s->formatDate('Y-m-d',$t), '1965-04-02', 'Error in day overflow 1');

		$t = $s->getTimeStamp(0,0,0,4,33,1971);
		$this->assertEquals($s->formatDate('Y-m-d',$t), '1971-05-03', 'Error in day overflow 2');
		$t = $s->getTimeStamp(0,0,0,1,60,1965);
		$this->assertEquals($s->formatDate('Y-m-d',$t), '1965-03-01', 'Error in day overflow 3 '.$s->getDate('Y-m-d',$t));
		$t = $s->getTimeStamp(0,0,0,12,32,1965);
		$this->assertEquals($s->formatDate('Y-m-d',$t), '1966-01-01', 'Error in day overflow 4 '.$s->getDate('Y-m-d',$t));
		$t = $s->getTimeStamp(0,0,0,12,63,1965);
		$this->assertEquals($s->formatDate('Y-m-d',$t), '1966-02-01', 'Error in day overflow 5 '.$s->getDate('Y-m-d',$t));
		$t = $s->getTimeStamp(0,0,0,13,3,1965);
		$this->assertEquals($s->formatDate('Y-m-d',$t), '1966-01-03', 'Error in mth overflow 1');
	}

	public function test2DigitTo4DigitYearConversion() {
		$s = new TDateTimeStamp;
		$this->assertEquals($s->get4DigitYear(00), 2000, "Err 2-digit 2000");
		$this->assertEquals($s->get4DigitYear(10), 2010, "Err 2-digit 2010");
		$this->assertEquals($s->get4DigitYear(20), 2020, "Err 2-digit 2020");
		$this->assertEquals($s->get4DigitYear(30), 2030, "Err 2-digit 2030");
		$this->assertEquals($s->get4DigitYear(40), 2040, "Err 2-digit 2040");
		$this->assertEquals($s->get4DigitYear(50), 1950, "Err 2-digit 1950");
		$this->assertEquals($s->get4DigitYear(90), 1990, "Err 2-digit 1990");
	}

	public function testStringFormating() {
		$s = new TDateTimeStamp;
		$fmt = '\d\a\t\e T Y-m-d H:i:s a A d D F g G h H i j l L m M n O \R\F\C2822 r s t U w y Y z Z 2003';
		$s1 = date($fmt,0);
		$s2 = $s->formatDate($fmt,0);
		$this->assertEquals($s1, $s2);//, " date() 0 failed \n $s1 \n $s2");

		for ($i=10; --$i > 0; ) {
				$ts = 3600.0*((rand()%60000)+(rand()%60000))+(rand()%60000);
				$s1 = date($fmt,$ts);
				$s2 = $s->formatDate($fmt,$ts);
				//print "$s1 <br>$s2 <p>";
				$this->assertEquals($s1,$s2);

				$a1 = getdate($ts);
				$a2 = $s->getDate($ts,false);
				$this->assertEquals($a1,$a2);
		}
	}

	public function testRandomDatesBetween100And4000() {
		$this->assertIsValidDate(100,1);
		//echo "Testing year ";
		for ($i=10; --$i >= 0;) {
			$y1 = 100+rand(0,1970-100);
			//echo $y1." ";
			$m = rand(1,12);
			$this->assertIsValidDate($y1,$m);

			$y1 = 3000-rand(0,3000-1970);
			//echo $y1." ";
			$this->assertIsValidDate($y1,$m);
		}
	}

	public function assertIsValidDate($y1,$m,$d=13) {
		$s = new TDateTimeStamp;
		$t = $s->getTimeStamp(0,0,0,$m,$d,$y1);
		$rez = $s->formatDate('Y-n-j H:i:s',$t);

		$this->assertEquals("$y1-$m-$d 00:00:00", $rez);
	}

	function testRandomDates() {
		$start = 1960+rand(0,10);
		$yrs = 12;
		$i = 365.25*86400*($start-1970);
		$offset = 36000+rand(10000,60000);
		$max = 365*$yrs*86400;
		$lastyear = 0;
		$s = new TDateTimeStamp;

		// we generate a timestamp, convert it to a date, and convert it back to a timestamp
		// and check if the roundtrip broke the original timestamp value.
		//print "Testing $start to ".($start+$yrs).", or $max seconds, offset=$offset: ";
		$fails = 0;
		for ($max += $i; $i < $max; $i += $offset) {
			$ret = $s->formatDate('m,d,Y,H,i,s',$i);
			$arr = explode(',',$ret);
			if ($lastyear != $arr[2])
				$lastyear = $arr[2];

			$newi = $s->getTimestamp($arr[3],$arr[4],$arr[5],$arr[0],$arr[1],$arr[2]);
			if ($i != $newi) {
				$fails++;
				//$j = mktime($arr[3],$arr[4],$arr[5],$arr[0],$arr[1],$arr[2]);
				//print "Error at $i, $j, getTimestamp() returned $newi ($ret)\n";
			}
		}
		$this->assertEquals($fails, 0);
	}
}

?>