#!/usr/bin/env vpython3
# 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.assertEqual(expected, result)
    self.assertEqual(datetime.timedelta(hours=11), result.utcoffset())
    self.assertEqual('+1100', result.tzname())
    self.assertEqual(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.assertEqual(expected, result)
    self.assertEqual(datetime.timedelta(hours=-8), result.utcoffset())
    self.assertEqual('-0800', result.tzname())
    self.assertEqual(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.assertEqual(expected, result)
    self.assertEqual(datetime.timedelta(hours=0), result.utcoffset())
    self.assertEqual('UTC', result.tzname())
    self.assertEqual(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.assertEqual('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.assertEqual('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')))
