#!/usr/bin/env vpython3
# Copyright 2016 The Chromium Authors
# 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  # noqa: E402


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")
        )
    )
