#!/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')))