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}