1<?php
2/*
3 * Unit tests for Horde_Mapi_Timezone utilities
4 *
5 * @author Michael J. Rubinsky <mrubinsk@horde.org>
6 * @category Horde
7 * @package Mapi_Utils
8 */
9class Horde_Mapi_TimezoneTest extends Horde_Test_Case
10{
11
12    protected $_offsets = array(
13        'America/New_York'    => array('bias' => 300,
14                                       'stdname' => '',
15                                       'stdyear' => 0,
16                                       'stdmonth' => 11,
17                                       'stdday' => 0,
18                                       'stdweek' => 1,
19                                       'stdhour' => 2,
20                                       'stdminute' => 0,
21                                       'stdsecond' => 0,
22                                       'stdmillis' => 0,
23                                       'stdbias' => 0,
24                                       'dstname' => '',
25                                       'dstyear' => 0,
26                                       'dstmonth' => 3,
27                                       'dstday' => 0,
28                                       'dstweek' => 2,
29                                       'dsthour' => 2,
30                                       'dstminute' => 0,
31                                       'dstsecond' => 0,
32                                       'dstmillis' => 0,
33                                       'dstbias' => -60),
34        'Europe/Berlin'       => array('bias' => -60,
35                                       'stdname' => '',
36                                       'stdyear' => 0,
37                                       'stdmonth' => 10,
38                                       'stdday' => 0,
39                                       'stdweek' => 5,
40                                       'stdhour' => 3,
41                                       'stdminute' => 0,
42                                       'stdsecond' => 0,
43                                       'stdmillis' => 0,
44                                       'stdbias' => 0,
45                                       'dstname' => '',
46                                       'dstyear' => 0,
47                                       'dstmonth' => 3,
48                                       'dstday' => 0,
49                                       'dstweek' => 5,
50                                       'dsthour' => 2,
51                                       'dstminute' => 0,
52                                       'dstsecond' => 0,
53                                       'dstmillis' => 0,
54                                       'dstbias' => -60),
55        'America/Los_Angeles' => array('bias' => 480,
56                                       'stdname' => '',
57                                       'stdyear' => 0,
58                                       'stdmonth' => 11,
59                                       'stdday' => 0,
60                                       'stdweek' => 1,
61                                       'stdhour' => 2,
62                                       'stdminute' => 0,
63                                       'stdsecond' => 0,
64                                       'stdmillis' => 0,
65                                       'stdbias' => 0,
66                                       'dstname' => '',
67                                       'dstyear' => 0,
68                                       'dstmonth' => 3,
69                                       'dstday' => 0,
70                                       'dstweek' => 2,
71                                       'dsthour' => 2,
72                                       'dstminute' => 0,
73                                       'dstsecond' => 0,
74                                       'dstmillis' => 0,
75                                       'dstbias' => -60,
76                                       'timezone' => 480,
77                                       'timezonedst' => -60),
78        'America/Phoenix'     => array('bias' => 420,
79                                       'stdname' => '',
80                                       'stdyear' => 0,
81                                       'stdmonth' => 0,
82                                       'stdday' => 0,
83                                       'stdweek' => 0,
84                                       'stdhour' => 0,
85                                       'stdminute' => 0,
86                                       'stdsecond' => 0,
87                                       'stdmillis' => 0,
88                                       'stdbias' => 0,
89                                       'dstname' => '',
90                                       'dstyear' => 0,
91                                       'dstmonth' => 0,
92                                       'dstday' => 0,
93                                       'dstweek' => 0,
94                                       'dsthour' => 0,
95                                       'dstminute' => 0,
96                                       'dstsecond' => 0,
97                                       'dstmillis' => 0,
98                                       'dstbias' => 0)
99    );
100
101    protected $_packed = array(
102        'America/New_York'    => 'LAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAABAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAACAAIAAAAAAAAAxP///w==',
103        'America/Los_Angeles' => '4AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAABAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAACAAIAAAAAAAAAxP///w==',
104        'Europe/Berlin'       => 'xP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAFAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAFAAIAAAAAAAAAxP///w==',
105        'America/Phoenix'     => 'pAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==',
106    );
107
108
109    public function setUp()
110    {
111        $this->_oldTimezone = date_default_timezone_get();
112        date_default_timezone_set('America/New_York');
113    }
114
115    public function tearDown()
116    {
117        date_default_timezone_set($this->_oldTimezone);
118    }
119
120    /**
121     * Test building an Offset hash from a given ActiveSync style base64 encoded
122     * timezone structure.
123     */
124    public function testOffsetsFromSyncTZ()
125    {
126        foreach ($this->_packed as $tz => $blob) {
127            $offsets = Horde_Mapi_Timezone::getOffsetsFromSyncTZ($blob);
128            foreach ($this->_offsets[$tz] as $key => $value) {
129                $this->assertEquals($value, $offsets[$key]);
130            }
131        }
132    }
133
134    /**
135     * Test creating a Offset hash for a given timezone.
136     */
137    public function testGetOffsetsFromDate()
138    {
139        // The actual time doesn't matter, we really only need a year and a
140        // timezone that we are interested in.
141        foreach ($this->_offsets as $tz => $expected) {
142            $date = new Horde_Date('2011-07-01', $tz);
143            $offsets = Horde_Mapi_Timezone::getOffsetsFromDate($date);
144            foreach ($offsets as $key => $value) {
145                $this->assertEquals($expected[$key], $value);
146            }
147        }
148    }
149
150    /**
151     * Test generating an ActiveSync TZ structure given a TZ Offset hash
152     */
153    public function testGetSyncTZFromOffsets()
154    {
155        foreach ($this->_offsets as $tz => $offsets) {
156            $blob = Horde_Mapi_Timezone::getSyncTZFromOffsets($offsets);
157            $this->assertEquals($this->_packed[$tz], $blob);
158        }
159    }
160
161    /**
162     * Test guessing a timezone identifier from an ActiveSync timezone
163     * structure.
164     */
165    public function testGuessTimezoneFromOffsets()
166    {
167        $timezones = new Horde_Mapi_Timezone();
168
169        // Test general functionality, with expected timezone.
170        foreach ($this->_packed as $tz => $blob) {
171            $guessed = $timezones->getTimezone($blob, $tz);
172            $this->assertEquals($tz, $guessed);
173        }
174
175        // Test without a known timezone
176        $guessed = $timezones->getTimezone($this->_packed['America/New_York']);
177        $this->assertEquals('America/New_York', $guessed);
178
179        $guessed = $timezones->getTimezone($this->_packed['Europe/Berlin']);
180        $this->assertEquals('Europe/Berlin', $guessed);
181    }
182
183}