import PyOrgMode
import unittest


class TestDates(unittest.TestCase):
    """Test the org file parser with several date formats"""

    def test_baredate(self):
        """
        Tests parsing dates without time.
        """
        datestr = '<2013-11-20 Wed>'
        date = PyOrgMode.OrgDate(datestr)
        self.assertEqual(tuple(date.value), (2013, 11, 20, 0, 0, 0, 2, 324, -1))
        self.assertEqual(date.get_value(), datestr)

    def test_datetime(self):
        """
        Tests parsing dates with time.
        """
        datestr = '<2011-12-12 Mon 09:00>'
        date = PyOrgMode.OrgDate(datestr)
        self.assertEqual(tuple(date.value), (2011, 12, 12, 9, 0, 0, 0, 346, -1))
        self.assertEqual(date.get_value(), datestr)

    def test_datenoweekday(self):
        """
        Tests parsing simple dates without weekdays.
        """
        datestr = '<2013-11-20>'
        date = PyOrgMode.OrgDate(datestr)
        self.assertEqual(tuple(date.value), (2013, 11, 20, 0, 0, 0, 2, 324, -1))
        self.assertEqual(date.get_value(), datestr)

    def test_localizeddatetime_unicode(self):
        """
        Tests parsing dates with localized weekday name that uses non-ASCII.
        """
        datestr = '<2011-12-12 Пнд 09:00>' # Понедельник = Monday (Russian)
        date = PyOrgMode.OrgDate(datestr)
        self.assertEqual(tuple(date.value), (2011, 12, 12, 9, 0, 0, 0, 346, -1))
        self.assertEqual(date.get_value(), '<2011-12-12 Mon 09:00>')

    def test_localizeddatetime_dot(self):
        """
        Tests parsing dates with localized weekday name that includes a dot.
        """
        datestr = '<2011-12-12 al. 09:00>' # astelehena = Monday (Basque)
        date = PyOrgMode.OrgDate(datestr)
        self.assertEqual(tuple(date.value), (2011, 12, 12, 9, 0, 0, 0, 346, -1))
        self.assertEqual(date.get_value(), '<2011-12-12 Mon 09:00>')

    def test_timerange(self):
        """
        Tests parsing time ranges on the same day.
        """
        datestr = '<2012-06-28 Thu 12:00-13:00>'
        date = PyOrgMode.OrgDate(datestr)
        self.assertEqual(tuple(date.value), (2012, 6, 28, 12, 0, 0, 3, 180, -1))
        self.assertEqual(tuple(date.end), (2012, 6, 28, 13, 0, 0, 3, 180, -1))
        self.assertEqual(date.get_value(), datestr)

    def test_daterange(self):
        """
        Tests parsing date ranges.
        """
        datestr = '<2012-07-20 Fri>--<2012-07-31 Tue>'
        date = PyOrgMode.OrgDate(datestr)
        self.assertEqual(tuple(date.value), (2012, 7, 20, 0, 0, 0, 4, 202, -1))
        self.assertEqual(tuple(date.end), (2012, 7, 31, 0, 0, 0, 1, 213, -1))
        self.assertEqual(date.get_value(), datestr)

    def test_daterangewithtimes(self):
        """
        Tests parsing date ranges with times.
        """
        datestr = '<2012-07-20 Fri 09:00>--<2012-07-31 Tue 14:00>'
        date = PyOrgMode.OrgDate(datestr)
        self.assertEqual(tuple(date.value), (2012, 7, 20, 9, 0, 0, 4, 202, -1))
        self.assertEqual(tuple(date.end), (2012, 7, 31, 14, 0, 0, 1, 213, -1))
        self.assertEqual(date.get_value(), datestr)

if __name__ == '__main__':
    unittest.main()