1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3"""Tests for the Cocoa time implementation."""
4
5import decimal
6import unittest
7
8from dfdatetime import cocoa_time
9
10
11class CocoaTimeEpochTest(unittest.TestCase):
12  """Tests for the Cocoa time epoch."""
13
14  def testInitialize(self):
15    """Tests the __init__ function."""
16    cocoa_time_epoch = cocoa_time.CocoaTimeEpoch()
17    self.assertIsNotNone(cocoa_time_epoch)
18
19
20class CocoaTimeTest(unittest.TestCase):
21  """Tests for the Cocoa timestamp."""
22
23  # pylint: disable=protected-access
24
25  def testProperties(self):
26    """Tests the properties."""
27    cocoa_time_object = cocoa_time.CocoaTime(timestamp=395011845.0)
28    self.assertEqual(cocoa_time_object.timestamp, 395011845.0)
29
30    cocoa_time_object = cocoa_time.CocoaTime()
31    self.assertIsNone(cocoa_time_object.timestamp)
32
33  def testGetNormalizedTimestamp(self):
34    """Tests the _GetNormalizedTimestamp function."""
35    cocoa_time_object = cocoa_time.CocoaTime(timestamp=395011845.0)
36
37    normalized_timestamp = cocoa_time_object._GetNormalizedTimestamp()
38    self.assertEqual(normalized_timestamp, decimal.Decimal('1373319045.0'))
39
40    cocoa_time_object = cocoa_time.CocoaTime(
41        time_zone_offset=60, timestamp=395011845.0)
42
43    normalized_timestamp = cocoa_time_object._GetNormalizedTimestamp()
44    self.assertEqual(normalized_timestamp, decimal.Decimal('1373315445.0'))
45
46    cocoa_time_object = cocoa_time.CocoaTime()
47
48    normalized_timestamp = cocoa_time_object._GetNormalizedTimestamp()
49    self.assertIsNone(normalized_timestamp)
50
51  def testCopyFromDateTimeString(self):
52    """Tests the CopyFromDateTimeString function."""
53    cocoa_time_object = cocoa_time.CocoaTime()
54
55    cocoa_time_object.CopyFromDateTimeString('2013-07-08')
56    self.assertEqual(cocoa_time_object._timestamp, 394934400.0)
57    self.assertEqual(cocoa_time_object._time_zone_offset, 0)
58
59    cocoa_time_object.CopyFromDateTimeString('2013-07-08 21:30:45')
60    self.assertEqual(cocoa_time_object._timestamp, 395011845.0)
61    self.assertEqual(cocoa_time_object._time_zone_offset, 0)
62
63    cocoa_time_object.CopyFromDateTimeString('2013-07-08 21:30:45.546875')
64    self.assertEqual(cocoa_time_object._timestamp, 395011845.546875)
65    self.assertEqual(cocoa_time_object._time_zone_offset, 0)
66
67    cocoa_time_object.CopyFromDateTimeString('2013-07-08 21:30:45.546875-01:00')
68    self.assertEqual(cocoa_time_object._timestamp, 395011845.546875)
69    self.assertEqual(cocoa_time_object._time_zone_offset, -60)
70
71    cocoa_time_object.CopyFromDateTimeString('2013-07-08 21:30:45.546875+01:00')
72    self.assertEqual(cocoa_time_object._timestamp, 395011845.546875)
73    self.assertEqual(cocoa_time_object._time_zone_offset, 60)
74
75    cocoa_time_object.CopyFromDateTimeString('2001-01-02 00:00:00')
76    self.assertEqual(cocoa_time_object._timestamp, 86400.0)
77    self.assertEqual(cocoa_time_object._time_zone_offset, 0)
78
79  def testCopyToDateTimeString(self):
80    """Tests the CopyToDateTimeString function."""
81    cocoa_time_object = cocoa_time.CocoaTime(timestamp=395011845.546875)
82
83    date_time_string = cocoa_time_object.CopyToDateTimeString()
84    self.assertEqual(date_time_string, '2013-07-08 21:30:45.546875')
85
86    epoch_year = cocoa_time_object._EPOCH.year
87    cocoa_time_object._EPOCH.year = -1
88
89    with self.assertRaises(ValueError):
90      cocoa_time_object.CopyToDateTimeString()
91
92    cocoa_time_object._EPOCH.year = epoch_year
93
94    cocoa_time_object = cocoa_time.CocoaTime()
95
96    date_time_string = cocoa_time_object.CopyToDateTimeString()
97    self.assertIsNone(date_time_string)
98
99  def testCopyToDateTimeStringISO8601(self):
100    """Tests the CopyToDateTimeStringISO8601 function."""
101    cocoa_time_object = cocoa_time.CocoaTime(timestamp=395011845.546875)
102
103    date_time_string = cocoa_time_object.CopyToDateTimeStringISO8601()
104    self.assertEqual(date_time_string, '2013-07-08T21:30:45.546875Z')
105
106  def testGetDate(self):
107    """Tests the GetDate function."""
108    cocoa_time_object = cocoa_time.CocoaTime(timestamp=395011845.546875)
109
110    date_tuple = cocoa_time_object.GetDate()
111    self.assertEqual(date_tuple, (2013, 7, 8))
112
113    cocoa_time_object = cocoa_time.CocoaTime()
114
115    date_tuple = cocoa_time_object.GetDate()
116    self.assertEqual(date_tuple, (None, None, None))
117
118  def testGetDateWithTimeOfDay(self):
119    """Tests the GetDateWithTimeOfDay function."""
120    cocoa_time_object = cocoa_time.CocoaTime(timestamp=395011845.546875)
121
122    date_with_time_of_day_tuple = cocoa_time_object.GetDateWithTimeOfDay()
123    self.assertEqual(date_with_time_of_day_tuple, (2013, 7, 8, 21, 30, 45))
124
125    cocoa_time_object = cocoa_time.CocoaTime()
126
127    date_with_time_of_day_tuple = cocoa_time_object.GetDateWithTimeOfDay()
128    self.assertEqual(
129        date_with_time_of_day_tuple, (None, None, None, None, None, None))
130
131  # TODO: remove this method when there is no more need for it in plaso.
132  def testGetPlasoTimestamp(self):
133    """Tests the GetPlasoTimestamp function."""
134    cocoa_time_object = cocoa_time.CocoaTime(timestamp=395011845.0)
135
136    micro_posix_timestamp = cocoa_time_object.GetPlasoTimestamp()
137    self.assertEqual(micro_posix_timestamp, 1373319045000000)
138
139    cocoa_time_object = cocoa_time.CocoaTime()
140
141    micro_posix_timestamp = cocoa_time_object.GetPlasoTimestamp()
142    self.assertIsNone(micro_posix_timestamp)
143
144  def testGetTimeOfDay(self):
145    """Tests the GetTimeOfDay function."""
146    cocoa_time_object = cocoa_time.CocoaTime(timestamp=395011845.546875)
147
148    time_of_day_tuple = cocoa_time_object.GetTimeOfDay()
149    self.assertEqual(time_of_day_tuple, (21, 30, 45))
150
151    cocoa_time_object = cocoa_time.CocoaTime()
152
153    time_of_day_tuple = cocoa_time_object.GetTimeOfDay()
154    self.assertEqual(time_of_day_tuple, (None, None, None))
155
156
157if __name__ == '__main__':
158  unittest.main()
159