#!/usr/bin/env python
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Tests for git_dates."""

import datetime
import os
import sys
import unittest

DEPOT_TOOLS_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, DEPOT_TOOLS_ROOT)

from testing_support import coverage_utils


class GitDatesTestBase(unittest.TestCase):
  @classmethod
  def setUpClass(cls):
    super(GitDatesTestBase, cls).setUpClass()
    import git_dates
    cls.git_dates = git_dates


class GitDatesTest(GitDatesTestBase):
  def testTimestampOffsetToDatetime(self):
    # 2016-01-25 06:25:43 UTC
    timestamp = 1453703143

    offset = '+1100'
    expected_tz = self.git_dates.FixedOffsetTZ(datetime.timedelta(hours=11), '')
    expected = datetime.datetime(2016, 1, 25, 17, 25, 43, tzinfo=expected_tz)
    result = self.git_dates.timestamp_offset_to_datetime(timestamp, offset)
    self.assertEquals(expected, result)
    self.assertEquals(datetime.timedelta(hours=11), result.utcoffset())
    self.assertEquals('+1100', result.tzname())
    self.assertEquals(datetime.timedelta(0), result.dst())

    offset = '-0800'
    expected_tz = self.git_dates.FixedOffsetTZ(datetime.timedelta(hours=-8), '')
    expected = datetime.datetime(2016, 1, 24, 22, 25, 43, tzinfo=expected_tz)
    result = self.git_dates.timestamp_offset_to_datetime(timestamp, offset)
    self.assertEquals(expected, result)
    self.assertEquals(datetime.timedelta(hours=-8), result.utcoffset())
    self.assertEquals('-0800', result.tzname())
    self.assertEquals(datetime.timedelta(0), result.dst())

    # Invalid offset.
    offset = '-08xx'
    expected_tz = self.git_dates.FixedOffsetTZ(datetime.timedelta(hours=0), '')
    expected = datetime.datetime(2016, 1, 25, 6, 25, 43, tzinfo=expected_tz)
    result = self.git_dates.timestamp_offset_to_datetime(timestamp, offset)
    self.assertEquals(expected, result)
    self.assertEquals(datetime.timedelta(hours=0), result.utcoffset())
    self.assertEquals('UTC', result.tzname())
    self.assertEquals(datetime.timedelta(0), result.dst())

    # Offset out of range.
    offset = '+2400'
    self.assertRaises(ValueError, self.git_dates.timestamp_offset_to_datetime,
                      timestamp, offset)

  def testDatetimeString(self):
    tz = self.git_dates.FixedOffsetTZ(datetime.timedelta(hours=11), '')
    dt = datetime.datetime(2016, 1, 25, 17, 25, 43, tzinfo=tz)
    self.assertEquals('2016-01-25 17:25:43 +1100',
                      self.git_dates.datetime_string(dt))

    tz = self.git_dates.FixedOffsetTZ(datetime.timedelta(hours=-8), '')
    dt = datetime.datetime(2016, 1, 24, 22, 25, 43, tzinfo=tz)
    self.assertEquals('2016-01-24 22:25:43 -0800',
                      self.git_dates.datetime_string(dt))


if __name__ == '__main__':
  sys.exit(coverage_utils.covered_main(
    os.path.join(DEPOT_TOOLS_ROOT, 'git_dates.py')))
